diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-10 12:15:55 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-10 12:15:55 +0100 |
commit | d786df60b89e52c5e4a605f95c677f4bce4c6ec3 (patch) | |
tree | 3d39b967c91c964de458fdf28297c8fb52d1688c /src/helper.rs | |
parent | bc5c636a61411d8c29e64223a7d04263f2e68669 (diff) | |
download | unity-tools-d786df60b89e52c5e4a605f95c677f4bce4c6ec3.tar unity-tools-d786df60b89e52c5e4a605f95c677f4bce4c6ec3.tar.bz2 unity-tools-d786df60b89e52c5e4a605f95c677f4bce4c6ec3.tar.zst |
start work on serialized files
Diffstat (limited to 'src/helper.rs')
-rw-r--r-- | src/helper.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/helper.rs b/src/helper.rs index 79c2872..c2b9a92 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -1,28 +1,104 @@ use std::io::{Read, Result}; +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum Endianness { + Big, + Little, +} + pub trait ReadExt { + fn read_u8(&mut self) -> Result<u8>; fn read_u16_be(&mut self) -> Result<u16>; + fn read_i16(&mut self, e: Endianness) -> Result<i16>; + fn read_i16_be(&mut self) -> Result<i16>; + fn read_i16_le(&mut self) -> Result<i16>; + fn read_i32(&mut self, e: Endianness) -> Result<i32>; + fn read_i32_be(&mut self) -> Result<i32>; + fn read_i32_le(&mut self) -> Result<i32>; + fn read_u32(&mut self, e: Endianness) -> Result<u32>; fn read_u32_be(&mut self) -> Result<u32>; + fn read_u32_le(&mut self) -> Result<u32>; + fn read_u64(&mut self, e: Endianness) -> Result<u64>; fn read_u64_be(&mut self) -> Result<u64>; + fn read_u64_le(&mut self) -> Result<u64>; fn read_u128_be(&mut self) -> Result<u128>; fn read_cstr(&mut self) -> Result<String>; } impl<T: Read> ReadExt for T { + fn read_u8(&mut self) -> Result<u8> { + let mut buf = [0; 2]; + self.read_exact(&mut buf)?; + Ok(buf[0]) + } fn read_u16_be(&mut self) -> Result<u16> { let mut buf = [0; 2]; self.read_exact(&mut buf)?; Ok(u16::from_be_bytes(buf)) } + fn read_i16(&mut self, e: Endianness) -> Result<i16> { + match e { + Endianness::Big => self.read_i16_be(), + Endianness::Little => self.read_i16_le(), + } + } + fn read_i16_be(&mut self) -> Result<i16> { + let mut buf = [0; 2]; + self.read_exact(&mut buf)?; + Ok(i16::from_be_bytes(buf)) + } + fn read_i16_le(&mut self) -> Result<i16> { + let mut buf = [0; 2]; + self.read_exact(&mut buf)?; + Ok(i16::from_le_bytes(buf)) + } + fn read_i32(&mut self, e: Endianness) -> Result<i32> { + match e { + Endianness::Big => self.read_i32_be(), + Endianness::Little => self.read_i32_le(), + } + } + fn read_i32_be(&mut self) -> Result<i32> { + let mut buf = [0; 4]; + self.read_exact(&mut buf)?; + Ok(i32::from_be_bytes(buf)) + } + fn read_i32_le(&mut self) -> Result<i32> { + let mut buf = [0; 4]; + self.read_exact(&mut buf)?; + Ok(i32::from_le_bytes(buf)) + } + fn read_u32(&mut self, e: Endianness) -> Result<u32> { + match e { + Endianness::Big => self.read_u32_be(), + Endianness::Little => self.read_u32_le(), + } + } fn read_u32_be(&mut self) -> Result<u32> { let mut buf = [0; 4]; self.read_exact(&mut buf)?; Ok(u32::from_be_bytes(buf)) } + fn read_u32_le(&mut self) -> Result<u32> { + let mut buf = [0; 4]; + self.read_exact(&mut buf)?; + Ok(u32::from_le_bytes(buf)) + } + fn read_u64(&mut self, e: Endianness) -> Result<u64> { + match e { + Endianness::Big => self.read_u64_be(), + Endianness::Little => self.read_u64_le(), + } + } fn read_u64_be(&mut self) -> Result<u64> { let mut buf = [0; 8]; self.read_exact(&mut buf)?; Ok(u64::from_be_bytes(buf)) } + fn read_u64_le(&mut self) -> Result<u64> { + let mut buf = [0; 8]; + self.read_exact(&mut buf)?; + Ok(u64::from_le_bytes(buf)) + } fn read_u128_be(&mut self) -> Result<u128> { let mut buf = [0; 16]; self.read_exact(&mut buf)?; |