de.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. use std::convert::TryFrom;
  2. use std::str;
  3. use std::io::Read;
  4. use super::error::{Error, Result};
  5. use serde::de::{
  6. self,
  7. Visitor,
  8. DeserializeSeed,
  9. IntoDeserializer
  10. };
  11. pub struct Deserializer<'de, T: Read + ?Sized> {
  12. input: &'de mut T,
  13. }
  14. fn try_from<TSource, TDest: TryFrom<TSource>>(value: TSource) -> Result<TDest> {
  15. let cast = TDest::try_from(value).or_else(|_| Err(Error::TypeConversion))?;
  16. Ok(cast)
  17. }
  18. impl<'de, T: Read + ?Sized> Deserializer<'de, T> {
  19. pub fn new(input: &'de mut T) -> Self {
  20. Deserializer { input: input }
  21. }
  22. fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
  23. self.input.read_exact(buf).or_else(|e| Err(Error::Io(e)))?;
  24. Ok(())
  25. }
  26. fn read_u8(&mut self) -> Result<u8> {
  27. let mut buf = [0u8; 1];
  28. self.read_exact(&mut buf)?;
  29. Ok(buf[0])
  30. }
  31. fn read_u16(&mut self) -> Result<u16> {
  32. let mut buf = [0u8; 2];
  33. self.read_exact(&mut buf)?;
  34. Ok(u16::from_le_bytes(buf))
  35. }
  36. fn read_u32(&mut self) -> Result<u32> {
  37. let mut buf = [0u8; 4];
  38. self.read_exact(&mut buf)?;
  39. Ok(u32::from_le_bytes(buf))
  40. }
  41. fn read_u64(&mut self) -> Result<u64> {
  42. let mut buf = [0u8; 8];
  43. self.read_exact(&mut buf)?;
  44. Ok(u64::from_le_bytes(buf))
  45. }
  46. fn read_i8(&mut self) -> Result<i8> {
  47. let value = self.read_u8()?;
  48. try_from(value)
  49. }
  50. fn read_i16(&mut self) -> Result<i16> {
  51. let value = self.read_u16()?;
  52. try_from(value)
  53. }
  54. fn read_i32(&mut self) -> Result<i32> {
  55. let value = self.read_u32()?;
  56. try_from(value)
  57. }
  58. fn read_bool(&mut self) -> Result<bool> {
  59. let byte = self.read_u8()?;
  60. Ok(byte > 0)
  61. }
  62. fn read_vec(&mut self) -> Result<Vec<u8>> {
  63. let len = try_from(self.read_u32()?)?;
  64. let mut vec = vec![0; len];
  65. self.read_exact(vec.as_mut_slice())?;
  66. Ok(vec)
  67. }
  68. fn read_string(&mut self) -> Result<String> {
  69. let vec = self.read_vec()?;
  70. let value = String::from_utf8(vec).or_else(|_| Err(Error::TypeConversion))?;
  71. Ok(value)
  72. }
  73. }
  74. impl<'de, 'a, T: Read> de::Deserializer<'de> for &'a mut Deserializer<'de, T> {
  75. type Error = Error;
  76. fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
  77. Err(Error::Message("deserialize_any is not supported".to_string()))
  78. }
  79. fn deserialize_bool<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  80. let value = self.read_bool()?;
  81. visitor.visit_bool(value)
  82. }
  83. fn deserialize_i8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  84. let value = self.read_i8()?;
  85. visitor.visit_i8(value)
  86. }
  87. fn deserialize_i16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  88. let value = self.read_i16()?;
  89. visitor.visit_i16(value)
  90. }
  91. fn deserialize_i32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  92. let value = self.read_i32()?;
  93. visitor.visit_i32(value)
  94. }
  95. fn deserialize_i64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  96. let unsigned = self.read_u64()?;
  97. let signed = try_from(unsigned)?;
  98. visitor.visit_i64(signed)
  99. }
  100. fn deserialize_u8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  101. let value = self.read_u8()?;
  102. visitor.visit_u8(value)
  103. }
  104. fn deserialize_u16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  105. let value = self.read_u16()?;
  106. visitor.visit_u16(value)
  107. }
  108. fn deserialize_u32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  109. let value = self.read_u32()?;
  110. visitor.visit_u32(value)
  111. }
  112. fn deserialize_u64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  113. let value = self.read_u64()?;
  114. visitor.visit_u64(value)
  115. }
  116. fn deserialize_f32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  117. let mut buf = [0u8; 4];
  118. self.read_exact(&mut buf)?;
  119. let value = f32::from_le_bytes(buf);
  120. visitor.visit_f32(value)
  121. }
  122. fn deserialize_f64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  123. let mut buf = [0u8; 8];
  124. self.read_exact(&mut buf)?;
  125. let value = f64::from_le_bytes(buf);
  126. visitor.visit_f64(value)
  127. }
  128. fn deserialize_char<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  129. let byte = self.read_u8()?;
  130. let value = try_from(byte)?;
  131. visitor.visit_char(value)
  132. }
  133. fn deserialize_str<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  134. let value = self.read_string()?;
  135. visitor.visit_str(value.as_str())
  136. }
  137. fn deserialize_string<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  138. let value = self.read_string()?;
  139. visitor.visit_string(value)
  140. }
  141. fn deserialize_bytes<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  142. let value = self.read_vec()?;
  143. visitor.visit_bytes(value.as_slice())
  144. }
  145. fn deserialize_byte_buf<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  146. let value = self.read_vec()?;
  147. visitor.visit_byte_buf(value)
  148. }
  149. fn deserialize_option<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  150. let some = self.read_bool()?;
  151. if some {
  152. visitor.visit_some(self)
  153. }
  154. else {
  155. visitor.visit_none()
  156. }
  157. }
  158. fn deserialize_unit<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  159. visitor.visit_unit()
  160. }
  161. fn deserialize_unit_struct<V: Visitor<'de>>(
  162. self, _name: &'static str, visitor: V
  163. ) -> Result<V::Value> {
  164. visitor.visit_unit()
  165. }
  166. fn deserialize_newtype_struct<V: Visitor<'de>>(
  167. self, _name: &'static str, visitor: V
  168. ) -> Result<V::Value> {
  169. visitor.visit_newtype_struct(self)
  170. }
  171. fn deserialize_seq<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  172. let len = self.read_u32()?;
  173. visitor.visit_seq(SeqAccess { elements_left: len, deserializer: self})
  174. }
  175. fn deserialize_tuple<V: Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
  176. visitor.visit_seq(SeqAccess { elements_left: try_from(len)?, deserializer: self})
  177. }
  178. fn deserialize_tuple_struct<V: Visitor<'de>>(
  179. self, _name: &'static str, len: usize, visitor: V
  180. ) -> Result<V::Value> {
  181. self.deserialize_tuple(len, visitor)
  182. }
  183. fn deserialize_map<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  184. let len = self.read_u32()?;
  185. visitor.visit_map(SeqAccess { elements_left: len, deserializer: self})
  186. }
  187. fn deserialize_struct<V: Visitor<'de>>(
  188. self, _name: &'static str, fields: &'static [&'static str], visitor: V
  189. ) -> Result<V::Value> {
  190. self.deserialize_tuple(fields.len(), visitor)
  191. }
  192. fn deserialize_enum<V: Visitor<'de>>(
  193. self, _name: &'static str, _variants: &'static [&'static str], visitor: V
  194. ) -> Result<V::Value> {
  195. visitor.visit_enum(self)
  196. }
  197. fn deserialize_identifier<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
  198. Err(Error::NotSupported("Deserializer::deserialize_identifier"))
  199. }
  200. fn deserialize_ignored_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
  201. Err(Error::NotSupported("Deserializer::deserialize_ignored_any"))
  202. }
  203. fn is_human_readable(&self) -> bool {
  204. false
  205. }
  206. }
  207. struct SeqAccess<'a, 'de, T: Read> {
  208. elements_left: u32,
  209. deserializer: &'a mut Deserializer<'de, T>
  210. }
  211. impl<'a, 'de, T: Read> de::SeqAccess<'de> for SeqAccess<'a, 'de, T> {
  212. type Error = Error;
  213. fn next_element_seed<S: DeserializeSeed<'de>>(&mut self, seed: S) -> Result<Option<S::Value>> {
  214. if 0 == self.elements_left {
  215. return Ok(None)
  216. }
  217. self.elements_left -= 1;
  218. seed.deserialize(&mut *self.deserializer).map(Some)
  219. }
  220. }
  221. impl<'a, 'de, T: Read> de::MapAccess<'de> for SeqAccess<'a, 'de, T> {
  222. type Error = Error;
  223. fn next_key_seed<S: DeserializeSeed<'de>>(&mut self, seed: S) -> Result<Option<S::Value>> {
  224. if 0 == self.elements_left {
  225. return Ok(None)
  226. }
  227. self.elements_left -= 1;
  228. seed.deserialize(&mut *self.deserializer).map(Some)
  229. }
  230. fn next_value_seed<U: DeserializeSeed<'de>>(&mut self, seed: U) -> Result<U::Value> {
  231. seed.deserialize(&mut *self.deserializer)
  232. }
  233. }
  234. impl<'de, T: Read> de::VariantAccess<'de> for &mut Deserializer<'de, T> {
  235. type Error = Error;
  236. fn unit_variant(self) -> Result<()> {
  237. Ok(())
  238. }
  239. fn newtype_variant_seed<S: DeserializeSeed<'de>>(self, seed: S) -> Result<S::Value> {
  240. seed.deserialize(self)
  241. }
  242. fn tuple_variant<V: Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
  243. de::Deserializer::deserialize_tuple(self, len, visitor)
  244. }
  245. fn struct_variant<V: Visitor<'de>>(
  246. self, fields: &'static [&'static str], visitor: V
  247. ) -> Result<V::Value> {
  248. de::Deserializer::deserialize_struct(self, "", fields, visitor)
  249. }
  250. }
  251. impl<'a, 'de, T: Read> de::EnumAccess<'de> for &mut Deserializer<'de, T> {
  252. type Error = Error;
  253. type Variant = Self;
  254. fn variant_seed<S: DeserializeSeed<'de>>(self, seed: S) -> Result<(S::Value, Self::Variant)> {
  255. let int = self.read_u16()?;
  256. let index: u32 = try_from(int)?;
  257. let value = seed.deserialize(index.into_deserializer())?;
  258. Ok((value, self))
  259. }
  260. }
  261. mod test {
  262. #[allow(unused_imports)]
  263. use serde::Deserialize;
  264. #[allow(unused_imports)]
  265. use super::{Result, Deserializer};
  266. #[test]
  267. fn new() -> Result<()> {
  268. let vec: Vec<u8> = vec![0xA1, 0x42, 0x71, 0xAC];
  269. let mut slice = vec.as_slice();
  270. let de = Deserializer::new(&mut slice);
  271. assert_eq!(&vec.as_slice(), de.input);
  272. Ok(())
  273. }
  274. #[test]
  275. fn deserialize_struct() -> Result<()> {
  276. #[derive(Debug, PartialEq, Deserialize)]
  277. struct Order {
  278. customer: String,
  279. item_id: u16,
  280. quantity: u8
  281. }
  282. let expected = Order {
  283. customer: "Bob".to_string(),
  284. item_id: 256,
  285. quantity: 255
  286. };
  287. let vec: Vec<u8> = vec![
  288. 0x03, 0x00, 0x00, 0x00, 'B' as u8, 'o' as u8, 'b' as u8,
  289. 0x00, 0x01,
  290. 0xFF
  291. ];
  292. let mut slice = vec.as_slice();
  293. let mut de = Deserializer::new(&mut slice);
  294. let result = Deserialize::deserialize(&mut de);
  295. let actual = result?;
  296. assert_eq!(expected, actual);
  297. Ok(())
  298. }
  299. #[test]
  300. fn deserialize_enum() -> Result<()> {
  301. #[derive(Debug, PartialEq, Deserialize)]
  302. enum Emotions { Anguish, Catharsis }
  303. let vec: Vec<u8> = vec![0x01, 0x00];
  304. let mut slice = vec.as_slice();
  305. let mut de = Deserializer::new(&mut slice);
  306. let value = Deserialize::deserialize(&mut de)?;
  307. assert_eq!(Emotions::Catharsis, value);
  308. Ok(())
  309. }
  310. }