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 Independent = 0,
13 X86_64 = 1,
15 X86 = 2,
17 AArch64 = 3,
19 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}