1#![allow(non_snake_case, non_camel_case_types, clippy::upper_case_acronyms)]
3#[macro_use]
4extern crate shrinkwraprs;
5use crate::types::*;
6use std::convert::TryInto;
7use std::mem;
8pub mod types;
9
10#[derive(Debug)]
11pub struct SerializationError(pub String);
12#[derive(Debug)]
13pub struct DeserializationError(pub String);
14
15pub struct ReaderContext {
16 pub input: Vec<u8>,
17 pub ptr: usize,
18 top_of_table_stack: Vec<usize>,
19}
20
21impl ReaderContext {
22 pub fn new(input: Vec<u8>) -> Self {
23 ReaderContext {
24 input,
25 ptr: 0,
26 top_of_table_stack: vec![0],
27 }
28 }
29
30 fn consume_or_peek(
31 &mut self,
32 bytes: usize,
33 consume: bool,
34 ) -> Result<&[u8], DeserializationError> {
35 if self.ptr + bytes > self.input.len() {
36 Err(DeserializationError("End of file".to_string()))
37 } else {
38 let subslice = &self.input[self.ptr..self.ptr + bytes];
39 if consume {
40 self.ptr += bytes;
41 }
42 Ok(subslice)
43 }
44 }
45
46 fn consume(&mut self, bytes: usize) -> Result<&[u8], DeserializationError> {
47 self.consume_or_peek(bytes, true)
48 }
49
50 pub fn peek(&mut self, bytes: usize) -> Result<&[u8], DeserializationError> {
51 self.consume_or_peek(bytes, false)
52 }
53
54 pub fn push(&mut self) {
55 self.top_of_table_stack.push(self.ptr);
56 }
57 pub fn pop(&mut self) {
58 self.top_of_table_stack
59 .pop()
60 .expect("pop with no matching push");
61 }
62 pub fn top_of_table(&self) -> usize {
63 *self.top_of_table_stack.last().expect("not in a struct")
64 }
65 pub fn skip(&mut self, bytes: usize) {
66 self.ptr += bytes;
67 }
68}
69
70pub trait Serializer<T>
71where
72 T: Serialize,
73{
74 fn put(&mut self, data: T) -> Result<(), SerializationError>;
75}
76
77impl<T> Serializer<T> for Vec<u8>
78where
79 T: Serialize,
80{
81 fn put(&mut self, data: T) -> Result<(), SerializationError> {
82 data.to_bytes(self)
83 }
84}
85
86pub trait Deserializer<T>
87where
88 T: Deserialize,
89{
90 fn de(&mut self) -> Result<T, DeserializationError>;
91 fn de_counted(&mut self, s: usize) -> Result<Vec<T>, DeserializationError>;
92}
93
94impl<T> Deserializer<T> for ReaderContext
95where
96 T: Deserialize,
97{
98 fn de(&mut self) -> Result<T, DeserializationError> {
99 T::from_bytes(self)
100 }
101 fn de_counted(&mut self, s: usize) -> Result<Vec<T>, DeserializationError> {
102 (0..s)
103 .map(|_| {
104 let c: Result<T, DeserializationError> = self.de();
105 c
106 })
107 .collect()
108 }
109}
110
111impl std::fmt::Display for SerializationError {
112 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
113 write!(f, "Serialization error {:}", self.0)
114 }
115}
116
117impl std::fmt::Display for DeserializationError {
118 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
119 write!(f, "Deserialization error {:}", self.0)
120 }
121}
122
123impl std::error::Error for SerializationError {}
124impl std::error::Error for DeserializationError {}
125
126pub trait Serialize {
127 fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError>;
128}
129
130pub trait Deserialize {
131 fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError>
132 where
133 Self: std::marker::Sized;
134}
135
136macro_rules! serde_primitive {
137 ($t: ty) => {
138 impl Serialize for $t {
139 fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError> {
140 data.extend_from_slice(&self.to_be_bytes());
141 Ok(())
142 }
143 }
144
145 impl Deserialize for $t {
146 fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError> {
147 let bytes: &[u8] = c.consume(mem::size_of::<$t>())?;
148 let bytes_array: [u8; mem::size_of::<$t>()] = bytes
149 .try_into()
150 .map_err(|_| DeserializationError("Slice with incorrect length".to_string()))?;
151 Ok(<$t>::from_be_bytes(bytes_array))
152 }
153 }
154 };
155}
156
157serde_primitive!(i8);
158serde_primitive!(u8);
159serde_primitive!(u16);
160serde_primitive!(u32);
161serde_primitive!(i16);
162serde_primitive!(i32);
163serde_primitive!(i64);
164
165impl<T> Serialize for Vec<T>
166where
167 T: Serialize,
168{
169 fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError> {
170 for el in self {
171 el.to_bytes(data)?
172 }
173 Ok(())
174 }
175}
176
177impl<T> Deserialize for Vec<T>
178where
179 T: Deserialize,
180{
181 fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError> {
182 let mut res: Vec<T> = vec![];
183 loop {
184 let maybe: Result<T, DeserializationError> = c.de();
185 if let Ok(x) = maybe {
186 res.push(x);
187 } else {
188 break;
189 }
190 }
191 Ok(res)
192 }
193}
194
195#[derive(Shrinkwrap, Debug, PartialEq)]
196pub struct Counted<T>(pub Vec<T>);
197
198impl<T> Serialize for Counted<T>
199where
200 T: Serialize,
201{
202 fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError> {
203 (self.len() as uint16).to_bytes(data)?;
204 self.0.to_bytes(data)?;
205 Ok(())
206 }
207}
208
209impl<T> Deserialize for Counted<T>
210where
211 T: Deserialize,
212{
213 fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError> {
214 let len: uint16 = c.de()?;
215 let mut res: Vec<T> = vec![];
216 for _ in 0..len {
217 res.push(c.de()?)
218 }
219 Ok(Counted(res))
220 }
221}
222
223impl<T> From<Vec<T>> for Counted<T> {
224 fn from(v: Vec<T>) -> Self {
225 Counted(v)
226 }
227}
228
229impl<T> From<Counted<T>> for Vec<T> {
230 fn from(v: Counted<T>) -> Self {
231 v.0
232 }
233}
234
235impl<T> PartialEq<Vec<T>> for Counted<T>
236where
237 T: PartialEq,
238{
239 fn eq(&self, other: &std::vec::Vec<T>) -> bool {
240 &self.0 == other
241 }
242}
243
244impl<T> Serialize for &T
245where
246 T: Serialize,
247{
248 fn to_bytes(
249 &self,
250 data: &mut std::vec::Vec<u8>,
251 ) -> std::result::Result<(), SerializationError> {
252 (*self).to_bytes(data)
253 }
254}
255
256pub mod ser {
258 use crate::SerializationError;
259 use crate::Serialize;
260 use crate::Serializer;
261
262 pub fn to_bytes<T: Serialize>(data: &T) -> Result<Vec<u8>, SerializationError> {
263 let mut out = vec![];
264 out.put(data)?;
265 Ok(out)
266 }
267}
268pub mod de {
269 pub use crate::{DeserializationError, Deserialize, Deserializer, ReaderContext};
270 pub fn from_bytes<T: Deserialize>(data: &[u8]) -> Result<T, DeserializationError> {
271 let mut rc = ReaderContext::new(data.to_vec());
272 rc.de()
273 }
274}
275
276#[cfg(test)]
277mod tests {
278 use super::*;
279
280 #[test]
281 fn ser_primitive() {
282 let mut out = vec![];
283 out.put(1_u16).unwrap();
284 out.put(2_u16).unwrap();
285 out.put(4_u32).unwrap();
286 assert_eq!(out, [0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04]);
287 }
288
289 #[test]
290 fn de_primitive() {
291 let mut rc = ReaderContext::new(vec![0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04]);
292 let first: u16 = rc.de().unwrap();
293 let second: u16 = rc.de().unwrap();
294 let third: u32 = rc.de().unwrap();
295 assert_eq!(first, 1);
296 assert_eq!(second, 2);
297 assert_eq!(third, 4);
298 }
299
300 #[test]
301 fn ser_vec() {
302 let mut out = vec![];
303 let t: Vec<u16> = vec![1, 2, 3];
304 out.put(t).unwrap();
305 assert_eq!(out, [0x00, 0x01, 0x00, 0x02, 0x00, 0x03]);
306 }
307
308 #[test]
309 fn ser_counted() {
310 let mut out = vec![];
311 let t: Counted<u16> = vec![10, 11].into();
312 out.put(t).unwrap();
313 assert_eq!(out, [0x00, 0x02, 0x00, 0x0a, 0x00, 0x0b]);
314 }
315
316 #[test]
317 fn de_counted() {
318 let mut rc = ReaderContext::new(vec![0x00, 0x02, 0x00, 0x0a, 0x00, 0x0b]);
319 let t: Counted<u16> = rc.de().unwrap();
320 assert_eq!(t[0], 10);
321 assert_eq!(t, vec![10, 11]);
322 }
323
324 #[test]
325 fn ser_tag() {
326 let t = tag("GSUB");
327 let mut out = vec![];
328 out.put(t).unwrap();
329 assert_eq!(out, [0x47, 0x53, 0x55, 0x42]);
330 }
331
332 #[test]
333 fn de_tag() {
334 let mut rc = ReaderContext::new(vec![0x47, 0x53, 0x55, 0x42]);
335 let t: Tag = rc.de().unwrap();
336 assert_eq!(t, tag("GSUB"));
337 }
338
339 }