jubako 0.3.0

The reference implementation of the Jubako container format
Documentation
use crate::bases::*;

#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "explorable", derive(serde::Serialize))]
pub enum CompressionType {
    None = 0,
    Lz4 = 1,
    Lzma = 2,
    Zstd = 3,
}

impl Parsable for CompressionType {
    type Output = Self;
    fn parse(parser: &mut impl Parser) -> Result<Self> {
        let v = parser.read_u8()?;
        match v {
            0 => Ok(CompressionType::None),
            1 => Ok(CompressionType::Lz4),
            2 => Ok(CompressionType::Lzma),
            3 => Ok(CompressionType::Zstd),
            v => Err(format_error!(
                &format!("Invalid compression type ({v})"),
                parser
            )),
        }
    }
}

impl Serializable for CompressionType {
    fn serialize(&self, ser: &mut Serializer) -> IoResult<usize> {
        ser.write_u8(*self as u8)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_compressiontype() {
        let reader = CheckReader::from(vec![0x00, 0x01, 0x02, 0x03, 0x4, 0xFF]);
        let mut parser = reader.create_parser(Offset::zero(), 6.into()).unwrap();
        assert_eq!(
            CompressionType::parse(&mut parser).unwrap(),
            CompressionType::None
        );
        assert_eq!(
            CompressionType::parse(&mut parser).unwrap(),
            CompressionType::Lz4
        );
        assert_eq!(
            CompressionType::parse(&mut parser).unwrap(),
            CompressionType::Lzma
        );
        assert_eq!(
            CompressionType::parse(&mut parser).unwrap(),
            CompressionType::Zstd
        );
        assert_eq!(parser.tell(), Offset::new(4));
        assert!(CompressionType::parse(&mut parser).is_err());
    }
}