oozle 0.1.5

Open source Kraken, Mermaid, Selkie, Leviathan, LZNA, Bitknit decompressor
Documentation
use anyhow::{Error, Result};

use super::DecoderType;

pub(super) struct Header {
    pub decoder_type: DecoderType,
    pub restart_decoder: bool,
    pub uncompressed: bool,
    pub use_checksums: bool,
}

impl Header {
    pub fn parse(&mut self, input: &[u8]) -> Result<usize> {
        let mut header_byte: u8 = input[0];

        if header_byte & 0xF != 0xC || (header_byte >> 4) & 3 != 0 {
            return Err(Error::msg("Invalid data"));
        }

        self.restart_decoder = (header_byte >> 7) & 1 != 0;
        self.uncompressed = (header_byte >> 6) & 1 != 0;

        header_byte = input[1];

        self.decoder_type = DecoderType::from(header_byte & 0xF);
        self.use_checksums = (header_byte >> 7) & 1 != 0;

        if self.decoder_type == DecoderType::Unknown {
            return Err(Error::msg("Invalid data"));
        }

        Ok(2)
    }
}

impl Default for Header {
    fn default() -> Self {
        Self {
            decoder_type: DecoderType::Unknown,
            restart_decoder: false,
            uncompressed: false,
            use_checksums: false,
        }
    }
}