Skip to main content

zon_lib/
header.rs

1/// the magic number ZON! (0x5A4F4E21)
2pub const ZON_MAGIC: u32 = 0x5A4F4E21;
3
4/// the file header for ZON files.
5/// must be 64-byte aligned to ensure the start of the data segment
6/// is also cache-line aligned.
7#[repr(C, align(64))]
8#[derive(Debug, Clone, Copy)]
9pub struct ZonHeader {
10    pub magic: u32,
11    pub version: u32,
12    pub root: u32,
13    // reserved space to pad to 64 bytes.
14    // u32 + u32 + u32 = 12 bytes used.
15    // 64 - 12 = 52 bytes padding.
16    _reserved: [u8; 52],
17}
18
19impl Default for ZonHeader {
20    fn default() -> Self {
21        Self {
22            magic: ZON_MAGIC,
23            version: 1,
24            root: 0,
25            _reserved: [0; 52],
26        }
27    }
28}
29
30impl ZonHeader {
31    pub fn set_root(&mut self, offset: u32) {
32        self.root = offset;
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    use std::mem::{align_of, size_of};
40
41    #[test]
42    fn test_zon_header_layout() {
43        assert_eq!(align_of::<ZonHeader>(), 64, "ZonHeader must be 64-byte aligned");
44        assert_eq!(size_of::<ZonHeader>(), 64, "ZonHeader size must be exactly 64 bytes");
45    }
46
47    #[test]
48    fn test_magic_number() {
49        let header = ZonHeader::default();
50        assert_eq!(header.magic, 0x5A4F4E21);
51    }
52}