Skip to main content

pkgar_core/
flags.rs

1#[derive(Debug, Clone, Copy, PartialEq)]
2#[repr(u8)]
3pub enum DataVersion {
4    V0 = 0,
5    Reserved(u8),
6}
7
8#[derive(Debug, Clone, Copy, PartialEq)]
9#[repr(u8)]
10pub enum Architecture {
11    /// Architecture-independent
12    Independent = 0,
13    /// x86_64, base arch (x86_64-v1)
14    X86_64 = 1,
15    /// 32 bit x86, base arch (i586)
16    X86 = 2,
17    /// Aarch64, base arch (Armv8-A)
18    AArch64 = 3,
19    /// Riscv64, base arch (extension GC)
20    RiscV64 = 4,
21    Reserved(u8),
22}
23
24#[derive(Debug, Clone, Copy, PartialEq)]
25#[repr(u8)]
26pub enum Packaging {
27    Uncompressed = 0,
28    LZMA2 = 1,
29    Reserved(u8),
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, bytemuck::Pod, bytemuck::Zeroable)]
33#[repr(C, packed)]
34pub struct HeaderFlags(pub u32);
35
36impl HeaderFlags {
37    pub fn new(version: DataVersion, arch: Architecture, pkg: Packaging) -> Self {
38        let mut bits = 0u32;
39        bits |= (Self::val_version(version) as u32) << 0;
40        bits |= (Self::val_arch(arch) as u32) << 8;
41        bits |= (Self::val_pkg(pkg) as u32) << 16;
42        Self(bits)
43    }
44
45    pub fn latest(arch: Architecture, pkg: Packaging) -> Self {
46        Self::new(DataVersion::V0, arch, pkg)
47    }
48
49    pub fn version(&self) -> DataVersion {
50        match (self.0 >> 0) as u8 {
51            0 => DataVersion::V0,
52            v => DataVersion::Reserved(v),
53        }
54    }
55
56    pub fn architecture(&self) -> Architecture {
57        match (self.0 >> 8) as u8 {
58            0 => Architecture::Independent,
59            1 => Architecture::X86_64,
60            2 => Architecture::X86,
61            3 => Architecture::AArch64,
62            4 => Architecture::RiscV64,
63            v => Architecture::Reserved(v),
64        }
65    }
66
67    pub fn packaging(&self) -> Packaging {
68        match (self.0 >> 16) as u8 {
69            0 => Packaging::Uncompressed,
70            1 => Packaging::LZMA2,
71            v => Packaging::Reserved(v),
72        }
73    }
74
75    fn val_version(v: DataVersion) -> u8 {
76        match v {
77            DataVersion::V0 => 0,
78            DataVersion::Reserved(n) => n,
79        }
80    }
81    fn val_arch(a: Architecture) -> u8 {
82        match a {
83            Architecture::Independent => 0,
84            Architecture::X86_64 => 1,
85            Architecture::X86 => 2,
86            Architecture::AArch64 => 3,
87            Architecture::RiscV64 => 4,
88            Architecture::Reserved(n) => n,
89        }
90    }
91    fn val_pkg(p: Packaging) -> u8 {
92        match p {
93            Packaging::Uncompressed => 0,
94            Packaging::LZMA2 => 1,
95            Packaging::Reserved(n) => n,
96        }
97    }
98}
99
100impl Default for HeaderFlags {
101    fn default() -> Self {
102        Self(0)
103    }
104}
105
106impl From<u32> for HeaderFlags {
107    fn from(value: u32) -> Self {
108        Self(value)
109    }
110}
111
112impl Into<u32> for HeaderFlags {
113    fn into(self) -> u32 {
114        self.0
115    }
116}