use std::fmt;
#[derive(serde::Serialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Compression {
Gzip,
Xz,
Zstd,
Uncompressed,
Unknown,
}
impl fmt::Display for Compression {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
Compression::Gzip => "gzip",
Compression::Xz => "xz",
Compression::Zstd => "zstd",
Compression::Uncompressed => "uncompressed",
Compression::Unknown => "unknown",
};
f.write_str(s)
}
}
#[inline]
pub fn detect(bytes: &[u8]) -> Compression {
match bytes {
[0x1F, 0x8B, ..] => Compression::Gzip,
[0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00, ..] => Compression::Xz,
[0x28, 0xB5, 0x2F, 0xFD, ..] => Compression::Zstd,
[b'0', b'7', b'0', b'7', b'0', b'1', ..] => Compression::Uncompressed,
_ => Compression::Unknown,
}
}