Initial commit and proof of concept
commit
c134ee6ae6
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "recipe-sync-server-rs"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Test
|
||||||
|
|
||||||
|
## Test2
|
||||||
|
|
||||||
|
### Test
|
||||||
|
|
||||||
|
- X
|
||||||
|
- O
|
||||||
|
- I
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Something **new**
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
[toolchain]
|
||||||
|
channel = "1.93.1"
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
reorder_imports = true
|
||||||
|
hard_tabs = true
|
||||||
|
newline_style = "Unix"
|
||||||
|
|
@ -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<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");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue