pub mod flags {
pub const HUFFMAN: u8 = 0x01;
pub const ZLIB: u8 = 0x02;
pub const IMPLODE: u8 = 0x04;
pub const PKWARE: u8 = 0x08;
pub const BZIP2: u8 = 0x10;
pub const SPARSE: u8 = 0x20;
pub const ADPCM_MONO: u8 = 0x40;
pub const ADPCM_STEREO: u8 = 0x80;
pub const LZMA: u8 = 0x12;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CompressionMethod {
None,
Huffman,
Zlib,
Implode,
PKWare,
BZip2,
Sparse,
AdpcmMono,
AdpcmStereo,
Lzma,
Multiple(u8),
}
impl CompressionMethod {
pub fn from_flags(flags: u8) -> Self {
if flags == flags::LZMA {
return CompressionMethod::Lzma;
}
match flags {
0 => CompressionMethod::None,
flags::HUFFMAN => CompressionMethod::Huffman,
flags::ZLIB => CompressionMethod::Zlib,
flags::IMPLODE => CompressionMethod::Implode,
flags::PKWARE => CompressionMethod::PKWare,
flags::BZIP2 => CompressionMethod::BZip2,
flags::SPARSE => CompressionMethod::Sparse,
flags::ADPCM_MONO => CompressionMethod::AdpcmMono,
flags::ADPCM_STEREO => CompressionMethod::AdpcmStereo,
_ => CompressionMethod::Multiple(flags),
}
}
pub fn is_multiple(&self) -> bool {
matches!(self, CompressionMethod::Multiple(_))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compression_method_from_flags() {
assert_eq!(CompressionMethod::from_flags(0), CompressionMethod::None);
assert_eq!(
CompressionMethod::from_flags(flags::ZLIB),
CompressionMethod::Zlib
);
assert_eq!(
CompressionMethod::from_flags(flags::BZIP2),
CompressionMethod::BZip2
);
assert_eq!(
CompressionMethod::from_flags(flags::LZMA),
CompressionMethod::Lzma
);
let multi = flags::ZLIB | flags::PKWARE;
assert!(CompressionMethod::from_flags(multi).is_multiple());
}
}