1#[derive(Clone,Copy,Eq,Hash,Ord,PartialEq,PartialOrd)]
3pub struct TypeID(pub [u8; 4]);
4
5macro_rules! type_id {
6 ($name:ident, $val:expr) => (
7 pub const $name: TypeID = TypeID([$val[0], $val[1], $val[2], $val[3]]);
8 );
9 ($name:ident) => (
10 type_id!($name, stringify!($name).as_bytes());
11 )
12}
13
14type_id!(FORM);
15type_id!(LIST);
16type_id!(FORM_LE, b"MROF");
17type_id!(LIST_LE, b"TSIL");
18
19impl TypeID {
20 pub fn from_data(data: &[u8; 4], little_endian: bool) -> Self {
21 if little_endian {
22 TypeID([data[3], data[2], data[1], data[0]])
23 } else {
24 TypeID([data[0], data[1], data[2], data[3]])
25 }
26 }
27
28 pub fn to_data(&self, data: &mut [u8; 4], little_endian: bool) {
29 if little_endian {
30 data[0] = self.0[3];
31 data[1] = self.0[2];
32 data[2] = self.0[1];
33 data[3] = self.0[0];
34 } else {
35 data[0] = self.0[0];
36 data[1] = self.0[1];
37 data[2] = self.0[2];
38 data[3] = self.0[3];
39 }
40 }
41
42
43 pub fn is_le_envelope(self) -> bool {
44 match self {
45 FORM_LE | LIST_LE => true,
46 _ => false,
47 }
48 }
49
50 pub fn is_envelope(self) -> bool {
51 match self {
52 FORM | LIST => true,
53 _ => false,
54 }
55 }
56 pub fn reverse(&self) -> TypeID {
57 TypeID([self.0[3], self.0[2], self.0[1], self.0[0]])
58 }
59}
60
61impl std::fmt::Display for TypeID {
62 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::result::Result<(),std::fmt::Error> {
63 write!(f, "{}{}{}{}", self.0[0] as char, self.0[1] as char, self.0[2] as char, self.0[3] as char)
64 }
65}
66
67impl std::fmt::Debug for TypeID {
68 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
69 write!(f, "TypeID(b\"{}\")", self)
70 }
71}
72
73impl<'a> From<&'a [u8; 4]> for TypeID {
74 fn from(id: &'a [u8; 4]) -> TypeID {
75 TypeID([id[0], id[1], id[2], id[3]])
76 }
77}
78
79type_id!(L6BA);
80type_id!(L6CO);
81type_id!(L6PA);
82type_id!(L6TE);
83type_id!(L6AS);
84type_id!(L6FS);
85type_id!(HEAD);
86type_id!(BANK);
87type_id!(FLDR);
88type_id!(BINF);
89type_id!(PINF);
90type_id!(MINF);
91type_id!(MODL);
92type_id!(PARM);
93type_id!(PATC);
94type_id!(UNFO);
95type_id!(INFO);
96type_id!(META);
97type_id!(TUNE);
98type_id!(TN12);
99type_id!(TNAC);
100type_id!(TNGS);
101type_id!(TNG2);
102type_id!(PKPS);
103type_id!(PKP_);
104type_id!(L6GP);
105type_id!(TONE);
106type_id!(AMP_);
107type_id!(CAB_);
108type_id!(PRFX);
109type_id!(EFX_);
110type_id!(SSLB);
111type_id!(LHDR);
112type_id!(WSEQ);
113type_id!(LENT);
114
115pub const UNALIGNED_CHUNKS: &[&TypeID] = &[ &SSLB ];
116pub const PATCH_IDS: &[&TypeID] = &[ &L6PA, &L6AS, &L6FS, &L6TE, &L6GP ];
117pub const BUNDLE_IDS: &[&TypeID] = &[ &L6BA, &L6CO, &SSLB ];
118
119type_id!(IAUT);
120type_id!(IBND);
121type_id!(ICMT);
122type_id!(IGTR);
123type_id!(ISNG);
124type_id!(ISTL);
125type_id!(IPUS);
126type_id!(IPUP);
127type_id!(IDAT);
128type_id!(IAMP);
129type_id!(IAPP);
130type_id!(IAPV);