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 }