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"); } }