feat: use cursors instead of byte arrays

This commit is contained in:
2026-07-04 23:20:16 +02:00
parent b0e230d4d8
commit dee178ebc2
9 changed files with 136 additions and 99 deletions
+40
View File
@@ -0,0 +1,40 @@
use std::io::{Cursor, Read};
pub trait CursorExt {
fn read_u8(&mut self) -> anyhow::Result<u8>;
fn read_u16(&mut self) -> anyhow::Result<u16>;
fn read_u32(&mut self) -> anyhow::Result<u32>;
fn read_bytes(&mut self, len: usize) -> anyhow::Result<Vec<u8>>;
fn read_string(&mut self, len: usize) -> anyhow::Result<String>;
}
impl CursorExt for Cursor<&[u8]> {
fn read_u8(&mut self) -> anyhow::Result<u8> {
let mut result = [0u8; 1];
self.read_exact(&mut result)?;
Ok(result[0])
}
fn read_u16(&mut self) -> anyhow::Result<u16> {
let mut result = [0u8; 2];
self.read_exact(&mut result)?;
Ok(u16::from_be_bytes(result))
}
fn read_u32(&mut self) -> anyhow::Result<u32> {
let mut result = [0u8; 4];
self.read_exact(&mut result)?;
Ok(u32::from_be_bytes(result))
}
fn read_bytes(&mut self, len: usize) -> anyhow::Result<Vec<u8>> {
let mut result = vec![0u8; len];
self.read_exact(&mut result)?;
Ok(result)
}
fn read_string(&mut self, len: usize) -> anyhow::Result<String> {
let result = self.read_bytes(len)?;
Ok(String::from_utf8_lossy(&result).to_string())
}
}