use super::BinArchive;
use anyhow::Result;
pub struct BinArchiveWriter<'a> {
archive: &'a mut BinArchive,
position: usize
}
impl<'a> BinArchiveWriter<'a> {
pub fn new(archive: &'a mut BinArchive, position: usize) -> Self {
BinArchiveWriter {
archive,
position
}
}
pub fn write_u8(&mut self, value: u8) -> Result<()> {
self.archive.put_u8(self.position, value)?;
self.position += 1;
Ok(())
}
pub fn write_u16(&mut self, value: u16) -> Result<()> {
self.archive.put_u16(self.position, value)?;
self.position += 2;
Ok(())
}
pub fn write_u32(&mut self, value: u32) -> Result<()> {
self.archive.put_u32(self.position, value)?;
self.position += 4;
Ok(())
}
pub fn write_i8(&mut self, value: i8) -> Result<()> {
self.write_u8(value as u8)
}
pub fn write_i16(&mut self, value: i16) -> Result<()> {
self.write_u16(value as u16)
}
pub fn write_i32(&mut self, value: i32) -> Result<()> {
self.write_u32(value as u32)
}
pub fn write_bytes(&mut self, value: &[u8]) -> Result<()> {
for byte in value {
self.write_u8(*byte)?;
}
Ok(())
}
pub fn write_f32(&mut self, value: f32) -> Result<()> {
self.archive.put_f32(self.position, value)?;
self.position += 4;
Ok(())
}
pub fn write_string(&mut self, value: &Option<String>) -> Result<()> {
self.archive.put_text(self.position, value.as_ref())?;
self.position += 4;
Ok(())
}
pub fn write_label(&mut self, value: &str) -> Result<()> {
self.archive.put_label(self.position, value)
}
pub fn write_pointer(&mut self, value: usize) -> Result<()> {
if value == 0 {
self.archive.clear_pointer(self.position)?;
} else {
self.archive.put_pointer(self.position, value)?;
}
self.position += 4;
Ok(())
}
}