(rust) sending files via tcp
This commit is contained in:
+50
-112
@@ -1,131 +1,69 @@
|
||||
#![allow(dead_code, unused)]
|
||||
|
||||
mod log_handler;
|
||||
use std::fs::read;
|
||||
|
||||
use chrono::{
|
||||
DateTime, Local,
|
||||
DateTime,
|
||||
Local,
|
||||
};
|
||||
use clap::{
|
||||
Args,
|
||||
Parser,
|
||||
Subcommand
|
||||
};
|
||||
use clap::{Args, Parser, Subcommand};
|
||||
use sqlx::{
|
||||
database, migrate::MigrateDatabase, query, query_as, sqlite::{
|
||||
migrate::MigrateDatabase,
|
||||
query,
|
||||
query_as,
|
||||
Row,
|
||||
sqlite::{
|
||||
SqlitePool,
|
||||
SqlitePoolOptions,
|
||||
}, Row, Sqlite
|
||||
},
|
||||
Sqlite,
|
||||
};
|
||||
use tokio::{
|
||||
fs,
|
||||
io::{
|
||||
AsyncReadExt,
|
||||
AsyncWriteExt,
|
||||
},
|
||||
net::{
|
||||
TcpListener,
|
||||
TcpStream,
|
||||
},
|
||||
time::{
|
||||
Duration,
|
||||
sleep,
|
||||
},
|
||||
};
|
||||
|
||||
use log_handler::{LogType, Logger};
|
||||
|
||||
const DATABASE_URL: &str = "./test.db";
|
||||
const NAME_LOG_TABLE: &str = "logs";
|
||||
const NAME_TEST_TABLE: &str = "tests";
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[clap(author, version, about, long_about=None)]
|
||||
struct Arguments {
|
||||
/// subcommand
|
||||
#[command(subcommand)]
|
||||
pub action: Action,
|
||||
}
|
||||
|
||||
#[allow(non_camel_case_types)]
|
||||
#[derive(Debug, Clone, Subcommand)]
|
||||
pub enum Action {
|
||||
/// perform action on logs
|
||||
#[command(subcommand)]
|
||||
log(LogAction),
|
||||
|
||||
/// perform action on tests
|
||||
#[command(subcommand)]
|
||||
test(TestAction),
|
||||
}
|
||||
|
||||
#[allow(non_camel_case_types)]
|
||||
#[derive(Debug, Clone, Subcommand)]
|
||||
pub enum LogAction {
|
||||
add(LogAddArgs),
|
||||
get(LogGetArgs),
|
||||
remove(LogRemoveArgs),
|
||||
show(LogShowArgs),
|
||||
}
|
||||
|
||||
#[allow(non_camel_case_types)]
|
||||
#[derive(Debug, Clone, Subcommand)]
|
||||
pub enum TestAction {
|
||||
add(TestArgs),
|
||||
remove(TestArgs),
|
||||
show,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Args)]
|
||||
pub struct LogAddArgs {
|
||||
log_type: String,
|
||||
log_test: String,
|
||||
log_message: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Args)]
|
||||
pub struct LogGetArgs {
|
||||
id: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Args)]
|
||||
pub struct LogRemoveArgs {
|
||||
range_start: usize,
|
||||
range_stop: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Args)]
|
||||
pub struct LogShowArgs {
|
||||
range_start: Option<usize>,
|
||||
range_stop: Option<usize>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Args)]
|
||||
pub struct TestArgs {
|
||||
test_name: String,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
let args = Arguments::try_parse()?;
|
||||
let logger = Logger::setup().await.unwrap();
|
||||
let read_logger = logger.clone();
|
||||
let listener = TcpListener::bind("127.0.0.1:9090").await?;
|
||||
|
||||
match args.action {
|
||||
Action::log(subaction) => {
|
||||
match subaction {
|
||||
LogAction::add(args) => {
|
||||
logger.add_log(LogType::from_str(&args.log_type.as_str())?, &args.log_test, &args.log_message).await.unwrap();
|
||||
}
|
||||
LogAction::get(args) => {
|
||||
let record = logger.query_for_log(&format!("DELETE FROM logs WHERE log_id = {} RETURNING log_id, log_time, test_name, log_message;", args.id)).await.unwrap();
|
||||
println!("record: {:#?}", record);
|
||||
}
|
||||
LogAction::remove(args) => {
|
||||
_ = logger.query(&format!("DELETE FROM logs WHERE log_id BETWEEN {} AND {};", args.range_start, args.range_stop)).await;
|
||||
}
|
||||
LogAction::show(args) => {
|
||||
// let records = read_logger.query_for_log(&format!("SELECT log_id, log_time, log_type, test_name, log_message FROM logs;")).await.unwrap();
|
||||
let records = read_logger.query_for_log(&format!("SELECT * FROM logs;")).await.unwrap();
|
||||
println!("records: {:#?}", records);
|
||||
}
|
||||
}
|
||||
let file = fs::read("test.md").await?;
|
||||
|
||||
tokio::spawn(async move {
|
||||
sleep(Duration::from_secs(2)).await;
|
||||
|
||||
let mut connection = TcpStream::connect("127.0.0.1:9090").await.unwrap();
|
||||
connection.write_all(&file[..]).await.unwrap();
|
||||
});
|
||||
|
||||
let mut read_buffer = [0u8; 2<<16];
|
||||
match listener.accept().await {
|
||||
Ok((mut stream, address)) => {
|
||||
println!("accepted connection request from {}", address);
|
||||
let size = stream.read(&mut read_buffer).await?;
|
||||
fs::write("test-copy.md", &read_buffer[0..size]).await?;
|
||||
}
|
||||
Action::test(subaction) => {
|
||||
match subaction {
|
||||
TestAction::add(args) => {
|
||||
logger.add_test(args.test_name.as_str(), Local::now()).await?;
|
||||
}
|
||||
TestAction::remove(args) => {
|
||||
logger.remove_test(args.test_name.as_str()).await?;
|
||||
}
|
||||
TestAction::show => {
|
||||
let tests = logger.get_tests(None).await?;
|
||||
println!("tests: {:#?}", tests);
|
||||
}
|
||||
}
|
||||
Err(error) => {
|
||||
println!("this is unexpected.. {}", error.to_string());
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user