1use std::collections::HashSet;
2use std::ops::Deref;
3
4pub use byteorder::{BigEndian, ByteOrder, ReadBytesExt, WriteBytesExt};
5use failure::Fail;
6pub use num::ToPrimitive;
7
8pub use crate::types::uvar;
9use std::hash::BuildHasher;
10
11mod types;
12
13pub trait Deserialize: Sized {
16 fn deserialize<R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError>;
17
18 fn deserialize_from_vec(v: &Vec<u8>) -> Result<Self, SerializingError> {
19 Self::deserialize(&mut &v[..])
20 }
21}
22
23pub trait Serialize {
24 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError>;
25 fn serialized_size(&self) -> usize;
26
27 fn serialize_to_vec(&self) -> Vec<u8> {
28 let mut v = Vec::with_capacity(self.serialized_size());
29 self.serialize(&mut v).unwrap();
30 v
31 }
32}
33
34#[derive(Fail, Debug, PartialEq, Eq, Clone)]
37pub enum SerializingError {
38 #[fail(display = "IoError(kind={:?}, description={})", _0, _1)]
39 IoError(std::io::ErrorKind, String),
40 #[fail(display = "Invalid encoding")]
41 InvalidEncoding,
42 #[fail(display = "Invalid value")]
43 InvalidValue,
44 #[fail(display = "Overflow")]
45 Overflow,
46}
47
48impl From<std::io::Error> for SerializingError {
49 fn from(io_error: std::io::Error) -> Self {
50 SerializingError::IoError(io_error.kind(), format!("{}", io_error))
51 }
52}
53
54#[deprecated]
56impl From<SerializingError> for std::io::Error {
57 fn from(_: SerializingError) -> Self {
58 std::io::Error::from(std::io::ErrorKind::Other)
59 }
60}
61
62impl Deserialize for u8 {
65 fn deserialize<R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
66 Ok(reader.read_u8()?)
67 }
68}
69
70impl Serialize for u8 {
71 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
72 writer.write_u8(*self)?;
73 Ok(self.serialized_size())
74 }
75
76 fn serialized_size(&self) -> usize {
77 1
78 }
79}
80
81macro_rules! primitive_serialize {
82 ($t: ty, $len: expr, $r: ident, $w: ident) => {
83 impl Deserialize for $t {
84 fn deserialize<R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
85 Ok(reader.$r::<BigEndian>()?)
86 }
87 }
88
89 impl Serialize for $t {
90 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
91 writer.$w::<BigEndian>(*self)?;
92 Ok(self.serialized_size())
93 }
94
95 fn serialized_size(&self) -> usize {
96 $len
97 }
98 }
99 };
100}
101
102primitive_serialize!(u16, 2, read_u16, write_u16);
103primitive_serialize!(u32, 4, read_u32, write_u32);
104primitive_serialize!(u64, 8, read_u64, write_u64);
105
106
107impl Deserialize for i8 {
110 fn deserialize<R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
111 Ok(reader.read_i8()?)
112 }
113}
114
115impl Serialize for i8 {
116 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
117 writer.write_i8(*self)?;
118 Ok(self.serialized_size())
119 }
120
121 fn serialized_size(&self) -> usize {
122 1
123 }
124}
125
126primitive_serialize!(i16, 2, read_i16, write_i16);
127primitive_serialize!(i32, 4, read_i32, write_i32);
128primitive_serialize!(i64, 8, read_i64, write_i64);
129
130impl Deserialize for () {
133 fn deserialize<R: ReadBytesExt>(_reader: &mut R) -> Result<Self, SerializingError> { Ok(()) }
134}
135
136impl Serialize for () {
137 fn serialize<W: WriteBytesExt>(&self, _writer: &mut W) -> Result<usize, SerializingError> { Ok(0) }
138
139 fn serialized_size(&self) -> usize { 0 }
140}
141
142
143impl Deserialize for bool {
146 fn deserialize<R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
147 match reader.read_u8()? {
148 0 => Ok(false),
149 1 => Ok(true),
150 _ => Err(SerializingError::InvalidValue),
151 }
152 }
153}
154
155impl Serialize for bool {
156 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
157 writer.write_u8(if *self { 1u8 } else { 0u8 })?;
158 Ok(self.serialized_size())
159 }
160
161 fn serialized_size(&self) -> usize {
162 1
163 }
164}
165
166
167impl DeserializeWithLength for String {
170 fn deserialize<D: Deserialize + num::ToPrimitive, R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
171 let vec: Vec<u8> = DeserializeWithLength::deserialize::<D, R>(reader)?;
172 String::from_utf8(vec).or(Err(SerializingError::InvalidEncoding))
173 }
174}
175
176impl SerializeWithLength for String {
177 fn serialize<S: Serialize + num::FromPrimitive, W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
178 self.as_bytes().to_vec().serialize::<S, W>(writer)
179 }
180
181 fn serialized_size<S: Serialize + num::FromPrimitive>(&self) -> usize {
182 self.as_bytes().to_vec().serialized_size::<S>()
183 }
184}
185
186pub trait DeserializeWithLength: Sized {
189 fn deserialize<D: Deserialize + num::ToPrimitive, R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError>;
190 fn deserialize_from_vec<D: Deserialize + num::ToPrimitive>(v: &Vec<u8>) -> Result<Self, SerializingError> {
191 Self::deserialize::<D, _>(&mut &v[..])
192 }
193}
194
195pub trait SerializeWithLength {
196 fn serialize<S: Serialize + num::FromPrimitive, W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError>;
197 fn serialized_size<S: Serialize + num::FromPrimitive>(&self) -> usize;
198 fn serialize_to_vec<S: Serialize + num::FromPrimitive>(&self) -> Vec<u8> {
199 let mut v = Vec::with_capacity(self.serialized_size::<S>());
200 self.serialize::<S, Vec<u8>>(&mut v).unwrap();
201 v
202 }
203}
204
205impl<T: Deserialize> DeserializeWithLength for Vec<T> {
206 fn deserialize<D: Deserialize + num::ToPrimitive, R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
207 let len: D = Deserialize::deserialize(reader)?;
208 let len_u = len.to_usize().unwrap();
209 let mut v = Vec::with_capacity(len_u);
210 for _ in 0..len_u {
211 v.push(T::deserialize(reader)?);
212 }
213 Ok(v)
214 }
215}
216
217impl<T: Serialize> SerializeWithLength for Vec<T> {
218 fn serialize<S: Serialize + num::FromPrimitive, W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
219 let mut size = S::from_usize(self.len()).unwrap().serialize(writer)?;
220 for t in self {
221 size += t.serialize(writer)?;
222 }
223 Ok(size)
224 }
225
226 fn serialized_size<S: Serialize + num::FromPrimitive>(&self) -> usize {
227 let mut size = S::from_usize(self.len()).unwrap().serialized_size();
228 for t in self {
229 size += t.serialized_size();
230 }
231 size
232 }
233}
234
235impl<T: Deserialize> Deserialize for Box<T> {
238 fn deserialize<R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
239 Ok(Box::new(T::deserialize(reader)?))
240 }
241}
242
243impl<T: Serialize> Serialize for Box<T> {
244 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
245 Ok(T::serialize(self.deref(), writer)?)
246 }
247
248 fn serialized_size(&self) -> usize {
249 self.deref().serialized_size()
250 }
251}
252
253impl<T, H> DeserializeWithLength for HashSet<T, H>
256 where T: Deserialize + std::cmp::Eq + std::hash::Hash,
257 H: BuildHasher + Default
258{
259 fn deserialize<D: Deserialize + num::ToPrimitive, R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
260 let len: D = Deserialize::deserialize(reader)?;
261 let len_u = len.to_usize().unwrap();
262 let mut v = HashSet::with_capacity_and_hasher(len_u, H::default());
263 for _ in 0..len_u {
264 v.insert(T::deserialize(reader)?);
265 }
266 Ok(v)
267 }
268}
269
270impl<T, H> SerializeWithLength for HashSet<T, H>
271 where T: Serialize + std::cmp::Eq + std::hash::Hash,
272 H: BuildHasher
273{
274 fn serialize<S: Serialize + num::FromPrimitive, W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
275 let mut size = S::from_usize(self.len()).unwrap().serialize(writer)?;
276 for t in self {
277 size += t.serialize(writer)?;
278 }
279 Ok(size)
280 }
281
282 fn serialized_size<S: Serialize + num::FromPrimitive>(&self) -> usize {
283 let mut size = S::from_usize(self.len()).unwrap().serialized_size();
284 for t in self {
285 size += t.serialized_size();
286 }
287 size
288 }
289}
290
291impl<'a, T: Serialize> Serialize for &'a T {
294 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
295 Serialize::serialize(*self, writer)
296 }
297
298 fn serialized_size(&self) -> usize {
299 Serialize::serialized_size(*self)
300 }
301}
302
303impl<T: Deserialize> Deserialize for Option<T> {
304 fn deserialize<R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
305 let is_present: u8 = Deserialize::deserialize(reader)?;
306 match is_present {
307 0 => Ok(Option::None),
308 1 => Ok(Option::Some(Deserialize::deserialize(reader)?)),
309 _ => Err(SerializingError::InvalidValue),
310 }
311 }
312}
313
314impl<T: DeserializeWithLength> DeserializeWithLength for Option<T> {
315 fn deserialize<D: Deserialize + num::ToPrimitive, R: ReadBytesExt>(reader: &mut R) -> Result<Self, SerializingError> {
316 let is_present: u8 = Deserialize::deserialize(reader)?;
317 match is_present {
318 0 => Ok(Option::None),
319 1 => Ok(Option::Some(DeserializeWithLength::deserialize::<D, R>(reader)?)),
320 _ => Err(SerializingError::InvalidValue),
321 }
322 }
323}
324
325impl<T: Serialize> Serialize for Option<T> {
326 fn serialize<W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
327 match self {
328 Option::Some(one) => {
329 1u8.serialize(writer)?;
330 Ok(one.serialize(writer)? + 1)
331 }
332 Option::None => {
333 0u8.serialize(writer)
334 }
335 }
336 }
337
338 fn serialized_size(&self) -> usize {
339 match self {
340 Option::Some(one) => 1 + Serialize::serialized_size(one),
341 Option::None => 1
342 }
343 }
344}
345
346impl<T: SerializeWithLength> SerializeWithLength for Option<T> {
347 fn serialize<S: Serialize + num::FromPrimitive, W: WriteBytesExt>(&self, writer: &mut W) -> Result<usize, SerializingError> {
348 match self {
349 Option::Some(one) => {
350 1u8.serialize(writer)?;
351 Ok(SerializeWithLength::serialize::<S, W>(one, writer)? + 1)
352 }
353 Option::None => {
354 0u8.serialize(writer)
355 }
356 }
357 }
358
359 fn serialized_size<S: Serialize + num::FromPrimitive>(&self) -> usize {
360 match self {
361 Option::Some(one) => 1 + SerializeWithLength::serialized_size::<S>(one),
362 Option::None => 1
363 }
364 }
365}