l6t_file/
types.rs

1/// The Type ID of a chunk.
2#[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);