unarc-rs 0.6.1

Universal archive extraction & decompression library for retro + modern formats (7z, ZIP, RAR, LHA/LZH, TAR, ARJ, ARC/PAK, ZOO, HA, UC2, SQ/SQ2, SQZ, HYP, gz, bz2, Z).
Documentation
use crate::error::{ArchiveError, Result};

const TEXT: &[u8; 5] = b"HLSQZ";

#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OS {
    DOS = 0,
    OS2 = 1,
    MVS = 2,
    HPFS = 3,
    Amiga = 4,
    OsX = 5,
    Unix = 6,
    Unknown(u8),
}

impl From<u8> for OS {
    fn from(value: u8) -> Self {
        match value {
            0 => OS::DOS,
            1 => OS::OS2,
            2 => OS::MVS,
            3 => OS::HPFS,
            4 => OS::Amiga,
            5 => OS::OsX,
            6 => OS::Unix,
            _ => OS::Unknown(value),
        }
    }
}

pub struct SqzHeader {
    pub os: OS,
    pub flags: u8,
}

pub const SQZ_HEADER_SIZE: usize = 8;
impl SqzHeader {
    pub fn load_from(mut header_bytes: &[u8]) -> Result<Self> {
        if !header_bytes.starts_with(TEXT) {
            return Err(ArchiveError::invalid_header("SQZ"));
        }
        header_bytes = &header_bytes[TEXT.len()..];

        convert_u8!(_version, header_bytes);
        convert_u8!(os, header_bytes);
        convert_u8!(flags, header_bytes);

        Ok(Self { os: os.into(), flags })
    }
}