mrg 0.1.0

Deserialize Gravity Defied **levels.mrg** files
Documentation
use anyhow::Result;
use endianness::{read_i16, read_i32, ByteOrder};

pub struct Reader<'re> {
    bytes: &'re [u8],
    offset: usize,
}

impl<'re> Reader<'re> {
    pub const fn new(bytes: &'re [u8]) -> Self {
        let offset = 0;
        Self { bytes, offset }
    }

    pub const fn clone_from_offset(&self, offset: usize) -> Option<Self> {
        if offset > self.bytes.len() {
            None
        } else {
            Some(Self {
                bytes: self.bytes,
                offset,
            })
        }
    }

    pub fn read_int(&mut self) -> Result<i32> {
        let value = read_i32(&self.bytes[self.offset..], ByteOrder::BigEndian)?;
        self.offset += std::mem::size_of::<i32>();
        Ok(value)
    }

    pub fn read_short(&mut self) -> Result<i16> {
        let value = read_i16(&self.bytes[self.offset..], ByteOrder::BigEndian)?;
        self.offset += std::mem::size_of::<i16>();
        Ok(value)
    }

    pub fn read_byte(&mut self) -> Result<i8> {
        let value = self.bytes[self.offset];
        self.offset += std::mem::size_of::<i8>();
        Ok(value as i8)
    }
}