From f8cde8ac14eb30215998c10693af3c613e2b1855 Mon Sep 17 00:00:00 2001 From: Wynd Date: Sat, 21 Feb 2026 11:42:51 +0200 Subject: [PATCH] ByteBuffer struct to more easily write and read data --- src/buffer.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 34 +++++++++++------------------ 2 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 src/buffer.rs diff --git a/src/buffer.rs b/src/buffer.rs new file mode 100644 index 0000000..ba99f3f --- /dev/null +++ b/src/buffer.rs @@ -0,0 +1,59 @@ +#![allow(unused)] + +use std::{ + io::Write, + ops::{Deref, DerefMut}, +}; + +#[derive(Debug, Default)] +pub struct ByteBuffer { + buffer: Vec, + cursor: usize, +} + +impl ByteBuffer { + pub fn unread_len(&self) -> usize { + self.buffer.len() - self.cursor + } + + pub fn write_string(&mut self, value: &str) { + let _ = self.buffer.write(&value.len().to_be_bytes()); + let _ = self.buffer.write(value.as_bytes()); + } + + pub fn write_bytes(&mut self, value: &[u8]) { + let _ = self.buffer.write(value); + } + + pub fn read_string(&mut self) -> String { + let mut len_buffer = [0; 8]; + len_buffer.copy_from_slice(&self.buffer[self.cursor..self.cursor + 8]); + self.cursor += 8; + let len = usize::from_be_bytes(len_buffer); + + let mut name_buffer: Vec = vec![]; + name_buffer.extend(&self.buffer[self.cursor..self.cursor + len]); + self.cursor += len; + String::from_utf8(name_buffer.to_vec()).unwrap() + } + + pub fn read_bytes(&mut self, len: usize) -> Vec { + let buf = self.buffer[self.cursor..self.cursor + len].to_vec(); + self.cursor += len; + buf + } +} + +impl Deref for ByteBuffer { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.buffer + } +} + +impl DerefMut for ByteBuffer { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.buffer + } +} diff --git a/src/main.rs b/src/main.rs index 2ede73c..f3fa57a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,10 @@ use std::{ str::FromStr, }; +use crate::buffer::ByteBuffer; + +mod buffer; + const IP: &str = "0.0.0.0"; const PORT: &str = "9696"; @@ -29,16 +33,11 @@ fn handle_connection(mut conn: TcpStream) -> Result<()> { let files = ["examples/test.md", "examples/test2.md"]; for file in files { - let mut buffer: Vec = vec![]; + let mut buffer = ByteBuffer::default(); 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"); + buffer.write_string(file); + buffer.write_bytes(&data); let _ = conn.write_all(&buffer); let _ = conn.flush(); @@ -62,24 +61,15 @@ mod tests { assert!(conn.is_ok()); let mut conn = conn.unwrap(); - let mut buffer = Vec::new(); + let mut buffer = ByteBuffer::default(); 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(); - + let file_name = buffer.read_string(); assert_eq!(file_name, "examples/test.md"); + + // let content = buffer.read_bytes(buffer.unread_len()); + // println!("{}", String::from_utf8(content).unwrap()); } }