1mod de;
4mod error;
5mod ser;
6
7pub use self::error::{Error, ErrorKind};
8use std::io::Cursor;
9
10pub fn serialize<T: serde::Serialize>(value: &T) -> Result<Vec<u8>, Error> {
12 let mut result = vec![];
13 serde::Serialize::serialize(value, &mut ser::Serializer::new(&mut result))?;
14 Ok(result)
15}
16
17pub fn deserialize<T: serde::de::DeserializeOwned>(bytes: &[u8]) -> Result<T, Error> {
19 let mut deserializer = de::Deserializer::new(Cursor::new(bytes));
20 serde::Deserialize::deserialize(&mut deserializer)
21}
22
23macro_rules! impl_array_serializers {
25 ($ty:ident, $size:expr) => {
26 impl ::serde::Serialize for $ty {
27 fn serialize<S: ::serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
28 self.0.serialize(serializer)
29 }
30 }
31
32 impl<'de> ::serde::Deserialize<'de> for $ty {
33 fn deserialize<D: ::serde::Deserializer<'de>>(
34 deserializer: D,
35 ) -> Result<$ty, D::Error> {
36 struct ArrayVisitor;
37
38 impl<'de> ::serde::de::Visitor<'de> for ArrayVisitor {
39 type Value = $ty;
40
41 fn expecting(
42 &self,
43 formatter: &mut ::std::fmt::Formatter<'_>,
44 ) -> ::std::fmt::Result {
45 write!(formatter, "{}-byte string of arbitrary bytes", $size)
46 }
47
48 fn visit_seq<S: ::serde::de::SeqAccess<'de>>(
49 self,
50 mut seq: S,
51 ) -> Result<$ty, S::Error> {
52 let mut result = [0; $size];
53
54 for elem in result.iter_mut().take($size) {
55 match seq.next_element()? {
56 Some(val) => *elem = val,
57 None => return Err(::serde::de::Error::custom("end of stream")),
58 };
59 }
60
61 Ok($ty(result))
62 }
63 }
64
65 deserializer.deserialize_seq(ArrayVisitor)
66 }
67 }
68 };
69}