ByteBuffer struct to more easily write and read data
parent
c134ee6ae6
commit
f8cde8ac14
|
|
@ -0,0 +1,59 @@
|
||||||
|
#![allow(unused)]
|
||||||
|
|
||||||
|
use std::{
|
||||||
|
io::Write,
|
||||||
|
ops::{Deref, DerefMut},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct ByteBuffer {
|
||||||
|
buffer: Vec<u8>,
|
||||||
|
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<u8> = 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<u8> {
|
||||||
|
let buf = self.buffer[self.cursor..self.cursor + len].to_vec();
|
||||||
|
self.cursor += len;
|
||||||
|
buf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deref for ByteBuffer {
|
||||||
|
type Target = Vec<u8>;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.buffer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DerefMut for ByteBuffer {
|
||||||
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
|
&mut self.buffer
|
||||||
|
}
|
||||||
|
}
|
||||||
34
src/main.rs
34
src/main.rs
|
|
@ -6,6 +6,10 @@ use std::{
|
||||||
str::FromStr,
|
str::FromStr,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::buffer::ByteBuffer;
|
||||||
|
|
||||||
|
mod buffer;
|
||||||
|
|
||||||
const IP: &str = "0.0.0.0";
|
const IP: &str = "0.0.0.0";
|
||||||
const PORT: &str = "9696";
|
const PORT: &str = "9696";
|
||||||
|
|
||||||
|
|
@ -29,16 +33,11 @@ fn handle_connection(mut conn: TcpStream) -> Result<()> {
|
||||||
let files = ["examples/test.md", "examples/test2.md"];
|
let files = ["examples/test.md", "examples/test2.md"];
|
||||||
|
|
||||||
for file in files {
|
for file in files {
|
||||||
let mut buffer: Vec<u8> = vec![];
|
let mut buffer = ByteBuffer::default();
|
||||||
match read(format!("./{file}")) {
|
match read(format!("./{file}")) {
|
||||||
Ok(data) => {
|
Ok(data) => {
|
||||||
let _ = buffer.write(&file.len().to_be_bytes());
|
buffer.write_string(file);
|
||||||
let _ = buffer.write(file.as_bytes());
|
buffer.write_bytes(&data);
|
||||||
|
|
||||||
let _ = buffer.write(&data.len().to_be_bytes());
|
|
||||||
let _ = buffer.write(&data);
|
|
||||||
|
|
||||||
let _ = buffer.write(b"\n");
|
|
||||||
|
|
||||||
let _ = conn.write_all(&buffer);
|
let _ = conn.write_all(&buffer);
|
||||||
let _ = conn.flush();
|
let _ = conn.flush();
|
||||||
|
|
@ -62,24 +61,15 @@ mod tests {
|
||||||
assert!(conn.is_ok());
|
assert!(conn.is_ok());
|
||||||
|
|
||||||
let mut conn = conn.unwrap();
|
let mut conn = conn.unwrap();
|
||||||
let mut buffer = Vec::new();
|
let mut buffer = ByteBuffer::default();
|
||||||
|
|
||||||
let bytes_read = conn.read_to_end(&mut buffer);
|
let bytes_read = conn.read_to_end(&mut buffer);
|
||||||
assert!(bytes_read.is_ok());
|
assert!(bytes_read.is_ok());
|
||||||
|
|
||||||
let data = String::from_utf8(buffer);
|
let file_name = buffer.read_string();
|
||||||
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");
|
assert_eq!(file_name, "examples/test.md");
|
||||||
|
|
||||||
|
// let content = buffer.read_bytes(buffer.unread_len());
|
||||||
|
// println!("{}", String::from_utf8(content).unwrap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue