(rust) sending files via tcp

This commit is contained in:
2025-05-16 12:08:08 +02:00
committed by scbj
parent 5ce940c8b9
commit 705aea3ba9
+50 -112
View File
@@ -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(())
}