recipe-sync-server-rs/src/main.rs

86 lines
1.8 KiB
Rust
Raw Normal View History

2026-02-21 01:55:41 +02:00
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<T> = result::Result<T, ()>;
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<u8> = 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<u8> = 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");
}
}