use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
use crate::error::Error;
use std::io::{Read, Seek, SeekFrom, Write};
#[derive(Debug)]
pub struct Yaz0Header {
pub expected_size: usize,
}
impl Yaz0Header {
pub fn new(expected_size: usize) -> Yaz0Header {
Yaz0Header { expected_size }
}
pub fn parse<R>(reader: &mut R) -> Result<Yaz0Header, Error>
where
R: Read + Seek,
{
let mut magic = [0u8; 4];
reader.read_exact(&mut magic)?;
if &magic != b"Yaz0" {
return Err(Error::InvalidMagic);
}
let expected_size = reader.read_u32::<BigEndian>()?;
reader.seek(SeekFrom::Current(8))?;
Ok(Yaz0Header::new(expected_size as usize))
}
pub fn write<W>(&self, writer: &mut W) -> Result<(), Error>
where
W: Write,
{
writer.write_all(b"Yaz0")?;
writer.write_u32::<BigEndian>(self.expected_size as u32)?;
writer.write_all(&[0x0; 8])?;
Ok(())
}
}