use std::io::{Cursor, Read}; pub trait CursorExt { fn read_u8(&mut self) -> anyhow::Result; fn read_u16(&mut self) -> anyhow::Result; fn read_u32(&mut self) -> anyhow::Result; fn read_bytes(&mut self, len: usize) -> anyhow::Result>; fn read_string(&mut self, len: usize) -> anyhow::Result; } impl CursorExt for Cursor<&[u8]> { fn read_u8(&mut self) -> anyhow::Result { let mut result = [0u8; 1]; self.read_exact(&mut result)?; Ok(result[0]) } fn read_u16(&mut self) -> anyhow::Result { let mut result = [0u8; 2]; self.read_exact(&mut result)?; Ok(u16::from_be_bytes(result)) } fn read_u32(&mut self) -> anyhow::Result { 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> { let mut result = vec![0u8; len]; self.read_exact(&mut result)?; Ok(result) } fn read_string(&mut self, len: usize) -> anyhow::Result { let result = self.read_bytes(len)?; Ok(String::from_utf8_lossy(&result).to_string()) } }