Skip to main content

lowell_core/formats/
initramfs.rs

1use std::fmt;
2#[derive(serde::Serialize, Debug, PartialEq, Eq)]
3#[serde(rename_all = "lowercase")]
4pub enum Compression {
5    Gzip,
6    Xz,
7    Zstd,
8    Uncompressed,
9    Unknown,
10}
11
12impl fmt::Display for Compression {
13    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14        let s = match self {
15            Compression::Gzip => "gzip",
16            Compression::Xz => "xz",
17            Compression::Zstd => "zstd",
18            Compression::Uncompressed => "uncompressed",
19            Compression::Unknown => "unknown",
20        };
21        f.write_str(s)
22    }
23}
24
25#[inline]
26pub fn detect(bytes: &[u8]) -> Compression {
27    match bytes {
28        // gzip: 1F 8B
29        [0x1F, 0x8B, ..] => Compression::Gzip,
30
31        // xz: FD 37 7A 58 5A 00
32        [0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00, ..] => Compression::Xz,
33
34        // zstd: 28 B5 2F FD
35        [0x28, 0xB5, 0x2F, 0xFD, ..] => Compression::Zstd,
36
37        // uncompressed cpio (newc): ASCII "070701"
38        [b'0', b'7', b'0', b'7', b'0', b'1', ..] => Compression::Uncompressed,
39
40        // anything else
41        _ => Compression::Unknown,
42    }
43}