1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
use std::convert::TryFrom; pub trait Serializer { fn write(&mut self, bytes: &[u8]); } pub enum DeserializeError { InsufficientData, InvalidData, } pub trait Deserializer<'de> { fn read(&mut self, len: usize) -> Result<&'de [u8], DeserializeError>; } pub trait Serialize<'de>: Sized { fn serialize<S>(&self, serializer: &mut S) where S: Serializer; fn deserialize<D>(deserializer: &mut D) -> Result<Self, DeserializeError> where D: Deserializer<'de>; } macro_rules! impl_serialize_num { ($type:ty) => { impl<'de> Serialize<'de> for $type { fn serialize<S>(&self, serializer: &mut S) where S: Serializer, { serializer.write(&self.to_le_bytes()); } fn deserialize<D>(deserializer: &mut D) -> Result<Self, DeserializeError> where D: Deserializer<'de>, { let mut buf = [0; std::mem::size_of::<$type>()]; let bytes = deserializer.read(buf.len())?; buf.clone_from_slice(bytes); Ok(<$type>::from_le_bytes(buf)) } } }; } impl_serialize_num!(u8); impl_serialize_num!(u16); impl_serialize_num!(u32); impl<'de> Serialize<'de> for char { fn serialize<S>(&self, serializer: &mut S) where S: Serializer, { let value = *self as u32; value.serialize(serializer); } fn deserialize<D>(deserializer: &mut D) -> Result<Self, DeserializeError> where D: Deserializer<'de>, { let value = u32::deserialize(deserializer)?; char::try_from(value).map_err(|_| DeserializeError::InvalidData) } } impl<'de> Serialize<'de> for &'de [u8] { fn serialize<S>(&self, serializer: &mut S) where S: Serializer, { let len = self.len() as u32; len.serialize(serializer); serializer.write(self); } fn deserialize<D>(deserializer: &mut D) -> Result<Self, DeserializeError> where D: Deserializer<'de>, { let len = u32::deserialize(deserializer)?; deserializer.read(len as _) } } impl<'de> Serialize<'de> for &'de str { fn serialize<S>(&self, serializer: &mut S) where S: Serializer, { self.as_bytes().serialize(serializer) } fn deserialize<D>(deserializer: &mut D) -> Result<Self, DeserializeError> where D: Deserializer<'de>, { let bytes = <&[u8]>::deserialize(deserializer)?; std::str::from_utf8(bytes).map_err(|_| DeserializeError::InvalidData) } } impl Serializer for Vec<u8> { fn write(&mut self, buf: &[u8]) { self.extend_from_slice(buf); } } impl<'de> Deserializer<'de> for &'de [u8] { fn read(&mut self, len: usize) -> Result<&'de [u8], DeserializeError> { if len <= self.len() { let (before, after) = self.split_at(len); *self = after; Ok(before) } else { Err(DeserializeError::InsufficientData) } } }