/ src / header.rs
header.rs
 1  use deku::prelude::*;
 2  use std::io;
 3  use thiserror::Error;
 4  
 5  pub const MAGIC_APPLE_DOUBLE: u32 = 0x00051607;
 6  pub const VERSION_2: u32 = 0x00020000;
 7  
 8  #[derive(Error, Debug)]
 9  pub enum AppleDoubleError {
10      #[error("Invalid magic number: {0:08x}")]
11      InvalidMagic(u32),
12      #[error("Unsupported version: {0:08x}")]
13      UnsupportedVersion(u32),
14      #[error("I/O error: {0}")]
15      Io(#[from] io::Error),
16      #[error("Unexpected end of file")]
17      UnexpectedEof,
18      #[error("Deku error: {0}")]
19      Deku(#[from] DekuError),
20      #[error("Entry reader not supported for entry ID: {0}")]
21      UnsupportedReader(u32),
22  }
23  
24  #[derive(Debug, Clone, PartialEq, Eq, DekuRead, DekuWrite, DekuSize)]
25  #[deku(endian = "big")]
26  pub struct FileHeader {
27      #[deku(assert_eq = "MAGIC_APPLE_DOUBLE")]
28      pub magic: u32,
29      #[deku(assert_eq = "VERSION_2", pad_bytes_after = "16")]
30      pub version: u32,
31      pub entries_count: u16,
32  }
33  
34  impl FileHeader {}
35  
36  #[derive(Debug, Clone, Copy, PartialEq, Eq, DekuRead, DekuWrite, DekuSize)]
37  #[deku(endian = "big")]
38  pub struct EntryDescriptor {
39      pub id: u32,
40      pub offset: u32,
41      pub length: u32,
42  }