commit c134ee6ae6b8f68b9026150d6f367a529789ca73 Author: Wynd Date: Sat Feb 21 01:55:41 2026 +0200 Initial commit and proof of concept diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..f709f30 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "recipe-sync-server-rs" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..747a199 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "recipe-sync-server-rs" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/test.md b/examples/test.md new file mode 100644 index 0000000..3693b32 --- /dev/null +++ b/examples/test.md @@ -0,0 +1,9 @@ +# Test + +## Test2 + +### Test + +- X +- O +- I diff --git a/examples/test2.md b/examples/test2.md new file mode 100644 index 0000000..dba45a9 --- /dev/null +++ b/examples/test2.md @@ -0,0 +1 @@ +Something **new** diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..5355133 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.93.1" diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..c1d40b6 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,3 @@ +reorder_imports = true +hard_tabs = true +newline_style = "Unix" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..2ede73c --- /dev/null +++ b/src/main.rs @@ -0,0 +1,85 @@ +use std::{ + fs::read, + io::Write, + net::{SocketAddr, TcpListener, TcpStream}, + result, + str::FromStr, +}; + +const IP: &str = "0.0.0.0"; +const PORT: &str = "9696"; + +type Result = result::Result; + +fn main() -> Result<()> { + let socket = SocketAddr::from_str(&format!("{}:{}", IP, PORT)).unwrap(); + let listener = TcpListener::bind(socket).unwrap(); + + for stream in listener.incoming() { + match stream { + Ok(conn) => handle_connection(conn)?, + Err(e) => eprintln!("Something went wrong while listening {e}"), + } + } + + Ok(()) +} + +fn handle_connection(mut conn: TcpStream) -> Result<()> { + let files = ["examples/test.md", "examples/test2.md"]; + + for file in files { + let mut buffer: Vec = vec![]; + match read(format!("./{file}")) { + Ok(data) => { + let _ = buffer.write(&file.len().to_be_bytes()); + let _ = buffer.write(file.as_bytes()); + + let _ = buffer.write(&data.len().to_be_bytes()); + let _ = buffer.write(&data); + + let _ = buffer.write(b"\n"); + + let _ = conn.write_all(&buffer); + let _ = conn.flush(); + } + Err(_) => eprintln!("No file found"), + }; + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::io::Read; + + use super::*; + + #[test] + fn test_connection() { + let conn = TcpStream::connect(format!("{}:{}", IP, PORT)); + assert!(conn.is_ok()); + + let mut conn = conn.unwrap(); + let mut buffer = Vec::new(); + + let bytes_read = conn.read_to_end(&mut buffer); + assert!(bytes_read.is_ok()); + + let data = String::from_utf8(buffer); + assert!(data.is_ok()); + + let data = data.unwrap().into_bytes(); + + let mut usize_buffer = [0; 8]; + usize_buffer.copy_from_slice(&data[0..8]); + let path_len = usize::from_be_bytes(usize_buffer); + + let mut name_buffer: Vec = vec![]; + name_buffer.extend(&data[8..8 + path_len]); + let file_name = String::from_utf8(name_buffer.to_vec()).unwrap(); + + assert_eq!(file_name, "examples/test.md"); + } +}