57 lines
1.6 KiB
Rust
57 lines
1.6 KiB
Rust
use deku::ctx::{Endian, Order};
|
|
use deku::{DekuError, DekuWriter};
|
|
use deku::prelude::{Reader, Writer};
|
|
use deku::prelude::*;
|
|
|
|
pub fn read_pascal_string<R>(reader: &mut Reader<R>) -> core::result::Result<String, DekuError>
|
|
where
|
|
R: deku::no_std_io::Read + deku::no_std_io::Seek,
|
|
{
|
|
let byte_len = u32::from_reader_with_ctx(reader, Endian::Little)? as usize;
|
|
let mut bytes = vec![0u8; byte_len];
|
|
reader.read_bytes(byte_len, &mut bytes, Order::Msb0)?;
|
|
|
|
String::from_utf8(bytes).map_err(|err| DekuError::Parse(err.to_string().into()))
|
|
}
|
|
|
|
|
|
pub fn write_pascal_string<W>(
|
|
writer: &mut Writer<W>,
|
|
value: &String,
|
|
) -> core::result::Result<(), DekuError>
|
|
where
|
|
W: deku::no_std_io::Write + deku::no_std_io::Seek,
|
|
{
|
|
let bytes = value.as_bytes();
|
|
let byte_len =
|
|
u32::try_from(bytes.len()).map_err(|_| DekuError::Parse("string too large".into()))?;
|
|
|
|
byte_len.to_writer(writer, Endian::Little)?;
|
|
writer.write_bytes(bytes)?;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn read_bool_u8<R>(reader: &mut Reader<R>) -> core::result::Result<bool, DekuError>
|
|
where
|
|
R: deku::no_std_io::Read + deku::no_std_io::Seek,
|
|
{
|
|
let value = u8::from_reader_with_ctx(reader, Endian::Little)?;
|
|
match value {
|
|
0 => Ok(false),
|
|
1 => Ok(true),
|
|
_ => Err(DekuError::Parse("invalid bool value".into())),
|
|
}
|
|
}
|
|
|
|
pub fn write_bool_u8<W>(
|
|
writer: &mut Writer<W>,
|
|
value: &bool,
|
|
) -> core::result::Result<(), DekuError>
|
|
where
|
|
W: deku::no_std_io::Write + deku::no_std_io::Seek,
|
|
{
|
|
let encoded: u8 = if *value { 1 } else { 0 };
|
|
encoded.to_writer(writer, Endian::Little)?;
|
|
Ok(())
|
|
}
|