de.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  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. Deserialize,
  8. DeserializeOwned,
  9. Visitor,
  10. DeserializeSeed,
  11. IntoDeserializer
  12. };
  13. #[allow(dead_code)]
  14. pub fn from_vec<T: DeserializeOwned>(vec: &Vec<u8>) -> Result<T> {
  15. let mut slice = vec.as_slice();
  16. let result = from_read(&mut slice);
  17. result
  18. }
  19. #[allow(dead_code)]
  20. pub fn from_read<T: DeserializeOwned, R: Read>(read: &mut R) -> Result<T> {
  21. let mut de = Deserializer::new(read);
  22. let result = Deserialize::deserialize(&mut de);
  23. result
  24. }
  25. pub struct Deserializer<'de, T: Read + ?Sized> {
  26. input: &'de mut T,
  27. }
  28. fn try_from<TSource, TDest: TryFrom<TSource>>(value: TSource) -> Result<TDest> {
  29. let cast = TDest::try_from(value).or_else(|_| Err(Error::TypeConversion))?;
  30. Ok(cast)
  31. }
  32. /// Returns the number of bytes needed to store the unicode character in UTF-9 whose
  33. /// encoding begins with the given byte. If the given byte is not valid as the first byte
  34. /// for any character, then a failed result with Error::InvalidUtf7Char is returned.
  35. fn num_bytes_for_char(first_byte: u8) -> Result<usize> {
  36. if first_byte & 128u8 == 0 {
  37. return Ok(1);
  38. }
  39. for bit in 2..5 {
  40. let mask = 128u8 >> bit;
  41. if mask & first_byte == 0 {
  42. return Ok(bit);
  43. }
  44. }
  45. Err(Error::InvalidUtf8Char)
  46. }
  47. /// Returns the unicode code point of the character that is encoded in UTF-8 in the given buffer
  48. /// as a u32. If the given buffer is not of a valid length then a failed result is returned.
  49. /// No other verification is performed.
  50. fn u32_from_utf8(buf: &[u8]) -> Result<u32> {
  51. const MASK: u8 = 0b0011_1111;
  52. fn mask(byte: u8, mask: u8) -> u32 {
  53. (byte & mask) as u32
  54. }
  55. fn two_bytes(buf: &[u8]) -> u32 {
  56. mask(buf[0], 0b0001_1111) << 6 | mask(buf[1], MASK)
  57. }
  58. fn three_bytes(buf: &[u8]) -> u32 {
  59. mask(buf[0], 0b0000_1111) << 12 | mask(buf[1], MASK) << 6 | mask(buf[2], MASK)
  60. }
  61. fn four_bytes(buf: &[u8]) -> u32 {
  62. mask(buf[0], 0b0000_0111) << 18 | mask(buf[1], MASK) << 12 | mask(buf[2], MASK) << 6
  63. | mask(buf[3], MASK)
  64. }
  65. let code_point = match buf.len() {
  66. 1 => Some(buf[0] as u32),
  67. 2 => Some(two_bytes(buf)),
  68. 3 => Some(three_bytes(buf)),
  69. 4 => Some(four_bytes(buf)),
  70. _ => None
  71. };
  72. code_point.ok_or(Error::InvalidUtf8Char)
  73. }
  74. fn char_from_utf8(buf: &[u8]) -> Result<char> {
  75. let result = u32_from_utf8(buf);
  76. let option = char::from_u32(result?);
  77. option.ok_or(Error::InvalidUtf8Char)
  78. }
  79. impl<'de, T: Read + ?Sized> Deserializer<'de, T> {
  80. pub fn new(input: &'de mut T) -> Self {
  81. Deserializer { input: input }
  82. }
  83. fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
  84. self.input.read_exact(buf).or_else(|e| Err(Error::Io(e)))?;
  85. Ok(())
  86. }
  87. fn read_u8(&mut self) -> Result<u8> {
  88. let mut buf = [0u8; 1];
  89. self.read_exact(&mut buf)?;
  90. Ok(buf[0])
  91. }
  92. fn read_u16(&mut self) -> Result<u16> {
  93. let mut buf = [0u8; 2];
  94. self.read_exact(&mut buf)?;
  95. Ok(u16::from_le_bytes(buf))
  96. }
  97. fn read_u32(&mut self) -> Result<u32> {
  98. let mut buf = [0u8; 4];
  99. self.read_exact(&mut buf)?;
  100. Ok(u32::from_le_bytes(buf))
  101. }
  102. fn read_u64(&mut self) -> Result<u64> {
  103. let mut buf = [0u8; 8];
  104. self.read_exact(&mut buf)?;
  105. Ok(u64::from_le_bytes(buf))
  106. }
  107. fn read_i8(&mut self) -> Result<i8> {
  108. let value = self.read_u8()?;
  109. Ok(value as i8)
  110. }
  111. fn read_i16(&mut self) -> Result<i16> {
  112. let value = self.read_u16()?;
  113. Ok(value as i16)
  114. }
  115. fn read_i32(&mut self) -> Result<i32> {
  116. let value = self.read_u32()?;
  117. Ok(value as i32)
  118. }
  119. fn read_bool(&mut self) -> Result<bool> {
  120. let byte = self.read_u8()?;
  121. Ok(byte > 0)
  122. }
  123. fn read_vec(&mut self) -> Result<Vec<u8>> {
  124. let len = try_from(self.read_u32()?)?;
  125. let mut vec = vec![0; len];
  126. self.read_exact(vec.as_mut_slice())?;
  127. Ok(vec)
  128. }
  129. fn read_string(&mut self) -> Result<String> {
  130. let vec = self.read_vec()?;
  131. let value = String::from_utf8(vec).or_else(|_| Err(Error::TypeConversion))?;
  132. Ok(value)
  133. }
  134. }
  135. impl<'de, 'a, T: Read> de::Deserializer<'de> for &'a mut Deserializer<'de, T> {
  136. type Error = Error;
  137. fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
  138. Err(Error::Message("deserialize_any is not supported".to_string()))
  139. }
  140. fn deserialize_bool<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  141. let value = self.read_bool()?;
  142. visitor.visit_bool(value)
  143. }
  144. fn deserialize_i8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  145. let value = self.read_i8()?;
  146. visitor.visit_i8(value)
  147. }
  148. fn deserialize_i16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  149. let value = self.read_i16()?;
  150. visitor.visit_i16(value)
  151. }
  152. fn deserialize_i32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  153. let value = self.read_i32()?;
  154. visitor.visit_i32(value)
  155. }
  156. fn deserialize_i64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  157. let unsigned = self.read_u64()?;
  158. let signed = unsigned as i64;
  159. visitor.visit_i64(signed)
  160. }
  161. fn deserialize_u8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  162. let value = self.read_u8()?;
  163. visitor.visit_u8(value)
  164. }
  165. fn deserialize_u16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  166. let value = self.read_u16()?;
  167. visitor.visit_u16(value)
  168. }
  169. fn deserialize_u32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  170. let value = self.read_u32()?;
  171. visitor.visit_u32(value)
  172. }
  173. fn deserialize_u64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  174. let value = self.read_u64()?;
  175. visitor.visit_u64(value)
  176. }
  177. fn deserialize_f32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  178. let mut buf = [0u8; 4];
  179. self.read_exact(&mut buf)?;
  180. let value = f32::from_le_bytes(buf);
  181. visitor.visit_f32(value)
  182. }
  183. fn deserialize_f64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  184. let mut buf = [0u8; 8];
  185. self.read_exact(&mut buf)?;
  186. let value = f64::from_le_bytes(buf);
  187. visitor.visit_f64(value)
  188. }
  189. fn deserialize_char<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  190. let byte = self.read_u8()?;
  191. let buf_len = num_bytes_for_char(byte);
  192. let mut buf = vec![0; buf_len?];
  193. buf[0] = byte;
  194. self.read_exact(&mut buf[1..])?;
  195. let result = char_from_utf8(&buf);
  196. visitor.visit_char(result?)
  197. }
  198. fn deserialize_str<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  199. let value = self.read_string()?;
  200. visitor.visit_str(value.as_str())
  201. }
  202. fn deserialize_string<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  203. let value = self.read_string()?;
  204. visitor.visit_string(value)
  205. }
  206. fn deserialize_bytes<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  207. let value = self.read_vec()?;
  208. visitor.visit_bytes(value.as_slice())
  209. }
  210. fn deserialize_byte_buf<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  211. let value = self.read_vec()?;
  212. visitor.visit_byte_buf(value)
  213. }
  214. fn deserialize_option<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  215. let some = self.read_bool()?;
  216. if some {
  217. visitor.visit_some(self)
  218. }
  219. else {
  220. visitor.visit_none()
  221. }
  222. }
  223. fn deserialize_unit<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  224. visitor.visit_unit()
  225. }
  226. fn deserialize_unit_struct<V: Visitor<'de>>(
  227. self, _name: &'static str, visitor: V
  228. ) -> Result<V::Value> {
  229. visitor.visit_unit()
  230. }
  231. fn deserialize_newtype_struct<V: Visitor<'de>>(
  232. self, _name: &'static str, visitor: V
  233. ) -> Result<V::Value> {
  234. visitor.visit_newtype_struct(self)
  235. }
  236. fn deserialize_seq<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  237. let len = self.read_u32()?;
  238. visitor.visit_seq(SeqAccess { elements_left: len, deserializer: self})
  239. }
  240. fn deserialize_tuple<V: Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
  241. visitor.visit_seq(SeqAccess { elements_left: try_from(len)?, deserializer: self})
  242. }
  243. fn deserialize_tuple_struct<V: Visitor<'de>>(
  244. self, _name: &'static str, len: usize, visitor: V
  245. ) -> Result<V::Value> {
  246. self.deserialize_tuple(len, visitor)
  247. }
  248. fn deserialize_map<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
  249. let len = self.read_u32()?;
  250. visitor.visit_map(SeqAccess { elements_left: len, deserializer: self})
  251. }
  252. fn deserialize_struct<V: Visitor<'de>>(
  253. self, _name: &'static str, fields: &'static [&'static str], visitor: V
  254. ) -> Result<V::Value> {
  255. self.deserialize_tuple(fields.len(), visitor)
  256. }
  257. fn deserialize_enum<V: Visitor<'de>>(
  258. self, _name: &'static str, _variants: &'static [&'static str], visitor: V
  259. ) -> Result<V::Value> {
  260. visitor.visit_enum(self)
  261. }
  262. fn deserialize_identifier<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
  263. Err(Error::NotSupported("Deserializer::deserialize_identifier"))
  264. }
  265. fn deserialize_ignored_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
  266. Err(Error::NotSupported("Deserializer::deserialize_ignored_any"))
  267. }
  268. fn is_human_readable(&self) -> bool {
  269. false
  270. }
  271. }
  272. struct SeqAccess<'a, 'de, T: Read> {
  273. elements_left: u32,
  274. deserializer: &'a mut Deserializer<'de, T>
  275. }
  276. impl<'a, 'de, T: Read> de::SeqAccess<'de> for SeqAccess<'a, 'de, T> {
  277. type Error = Error;
  278. fn next_element_seed<S: DeserializeSeed<'de>>(&mut self, seed: S) -> Result<Option<S::Value>> {
  279. if 0 == self.elements_left {
  280. return Ok(None)
  281. }
  282. self.elements_left -= 1;
  283. seed.deserialize(&mut *self.deserializer).map(Some)
  284. }
  285. }
  286. impl<'a, 'de, T: Read> de::MapAccess<'de> for SeqAccess<'a, 'de, T> {
  287. type Error = Error;
  288. fn next_key_seed<S: DeserializeSeed<'de>>(&mut self, seed: S) -> Result<Option<S::Value>> {
  289. if 0 == self.elements_left {
  290. return Ok(None)
  291. }
  292. self.elements_left -= 1;
  293. seed.deserialize(&mut *self.deserializer).map(Some)
  294. }
  295. fn next_value_seed<U: DeserializeSeed<'de>>(&mut self, seed: U) -> Result<U::Value> {
  296. seed.deserialize(&mut *self.deserializer)
  297. }
  298. }
  299. impl<'de, T: Read> de::VariantAccess<'de> for &mut Deserializer<'de, T> {
  300. type Error = Error;
  301. fn unit_variant(self) -> Result<()> {
  302. Ok(())
  303. }
  304. fn newtype_variant_seed<S: DeserializeSeed<'de>>(self, seed: S) -> Result<S::Value> {
  305. seed.deserialize(self)
  306. }
  307. fn tuple_variant<V: Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
  308. de::Deserializer::deserialize_tuple(self, len, visitor)
  309. }
  310. fn struct_variant<V: Visitor<'de>>(
  311. self, fields: &'static [&'static str], visitor: V
  312. ) -> Result<V::Value> {
  313. de::Deserializer::deserialize_struct(self, "", fields, visitor)
  314. }
  315. }
  316. impl<'a, 'de, T: Read> de::EnumAccess<'de> for &mut Deserializer<'de, T> {
  317. type Error = Error;
  318. type Variant = Self;
  319. fn variant_seed<S: DeserializeSeed<'de>>(self, seed: S) -> Result<(S::Value, Self::Variant)> {
  320. let int = self.read_u16()?;
  321. let index: u32 = try_from(int)?;
  322. let value = seed.deserialize(index.into_deserializer())?;
  323. Ok((value, self))
  324. }
  325. }
  326. mod test {
  327. #[allow(unused_imports)]
  328. use serde::Deserialize;
  329. #[allow(unused_imports)]
  330. use super::{
  331. from_vec,
  332. num_bytes_for_char,
  333. Result,
  334. Deserializer
  335. };
  336. #[allow(unused_imports)]
  337. use std::collections::HashMap;
  338. #[test]
  339. fn new() -> Result<()> {
  340. let vec: Vec<u8> = vec![0xA1, 0x42, 0x71, 0xAC];
  341. let mut slice = vec.as_slice();
  342. let de = Deserializer::new(&mut slice);
  343. assert_eq!(&vec.as_slice(), de.input);
  344. Ok(())
  345. }
  346. #[test]
  347. fn test_num_bytes_for_char() -> Result<()> {
  348. fn test_case(c: char) -> Result<()> {
  349. let len = c.len_utf8();
  350. let mut buf: Vec<u8> = vec![0; len];
  351. c.encode_utf8(buf.as_mut_slice());
  352. let result = num_bytes_for_char(buf[0]);
  353. assert_eq!(len, result?);
  354. Ok(())
  355. }
  356. test_case('$')?;
  357. test_case('£')?;
  358. test_case('€')?;
  359. test_case('😑')?;
  360. Ok(())
  361. }
  362. #[test]
  363. fn deserialize_false() -> Result<()> {
  364. let vec: Vec<u8> = vec![0x00];
  365. let result = from_vec(&vec);
  366. assert_eq!(false, result?);
  367. Ok(())
  368. }
  369. #[test]
  370. fn deserialize_true() -> Result<()> {
  371. let vec: Vec<u8> = vec![0x01];
  372. let result = from_vec(&vec);
  373. assert_eq!(true, result?);
  374. Ok(())
  375. }
  376. #[test]
  377. fn deserialize_i8() -> Result<()> {
  378. let vec: Vec<u8> = vec![0xFE];
  379. let result = from_vec(&vec);
  380. assert_eq!(-2i8, result?);
  381. Ok(())
  382. }
  383. #[test]
  384. fn deserialize_i16() -> Result<()> {
  385. let vec: Vec<u8> = vec![0xFD, 0xFF];
  386. let result = from_vec(&vec);
  387. assert_eq!(-3i16, result?);
  388. Ok(())
  389. }
  390. #[test]
  391. fn deserialize_i32() -> Result<()> {
  392. let vec: Vec<u8> = vec![0xFE, 0xFF, 0xFF, 0xFF];
  393. let result = from_vec(&vec);
  394. assert_eq!(-2i32, result?);
  395. Ok(())
  396. }
  397. #[test]
  398. fn deserialize_i64() -> Result<()> {
  399. let vec: Vec<u8> = vec![0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
  400. let result = from_vec(&vec);
  401. assert_eq!(-2i64, result?);
  402. Ok(())
  403. }
  404. #[test]
  405. fn deserialize_u8() -> Result<()> {
  406. let vec: Vec<u8> = vec![0xFF];
  407. let result = from_vec(&vec);
  408. assert_eq!(255u8, result?);
  409. Ok(())
  410. }
  411. #[test]
  412. fn deserialize_u16() -> Result<()> {
  413. let vec: Vec<u8> = vec![0xFE, 0xFF];
  414. let result = from_vec(&vec);
  415. assert_eq!(0xFFFEu16, result?);
  416. Ok(())
  417. }
  418. #[test]
  419. fn deserialize_u32() -> Result<()> {
  420. let vec: Vec<u8> = vec![0xFE, 0xFF, 0xFF, 0xFF];
  421. let result = from_vec(&vec);
  422. assert_eq!(0xFFFFFFFEu32, result?);
  423. Ok(())
  424. }
  425. #[test]
  426. fn deserialize_u64() -> Result<()> {
  427. let vec: Vec<u8> = vec![0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
  428. let result = from_vec(&vec);
  429. assert_eq!(0xFFFFFFFFFFFFFFFEu64, result?);
  430. Ok(())
  431. }
  432. #[test]
  433. fn deserialize_f32() -> Result<()> {
  434. let vec: Vec<u8> = vec![0x00, 0x00, 0x20, 0x3E];
  435. let result = from_vec(&vec);
  436. assert_eq!(0.15625f32, result?);
  437. Ok(())
  438. }
  439. #[test]
  440. fn deserialize_f64() -> Result<()> {
  441. let vec: Vec<u8> = vec![0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F];
  442. let result = from_vec(&vec);
  443. assert_eq!(1f64, result?);
  444. Ok(())
  445. }
  446. #[test]
  447. fn deserialize_char() -> Result<()> {
  448. fn test_case(c: char, vec: Vec<u8>) -> Result<()> {
  449. let result = from_vec(&vec);
  450. assert_eq!(c, result?);
  451. Ok(())
  452. }
  453. test_case('*', vec![0x2A])?;
  454. test_case('£', vec![0xC2, 0xA3])?;
  455. test_case('€', vec![0xE2, 0x82, 0xAC])?;
  456. test_case('😎', vec![0xF0, 0x9F, 0x98, 0x8E])?;
  457. Ok(())
  458. }
  459. #[test]
  460. fn deserialize_string() -> Result<()> {
  461. let vec: Vec<u8> = vec![
  462. 0x06, 0x00, 0x00, 0x00,
  463. 'l' as u8, 'o' as u8, 'c' as u8, 'a' as u8, 's' as u8, 'h' as u8
  464. ];
  465. let result: Result<String> = from_vec(&vec);
  466. assert_eq!("locash", result?);
  467. Ok(())
  468. }
  469. #[test]
  470. fn deserialize_byte_buf() -> Result<()> {
  471. let vec: Vec<u8> = vec![0x04, 0x00, 0x00, 0x00, 0x42, 0x91, 0xBE, 0xEF];
  472. let result: Result<Vec<u8>> = from_vec(&vec);
  473. assert_eq!(&vec[4..], result?);
  474. Ok(())
  475. }
  476. #[test]
  477. fn deserialize_none() -> Result<()> {
  478. let vec: Vec<u8> = vec![0x00];
  479. let result: Result<Option<u8>> = from_vec(&vec);
  480. assert_eq!(None, result?);
  481. Ok(())
  482. }
  483. #[test]
  484. fn deserialize_some() -> Result<()> {
  485. let vec: Vec<u8> = vec![0x01, 0xD5];
  486. let result: Result<Option<u8>> = from_vec(&vec);
  487. assert_eq!(Some(0xD5u8), result?);
  488. Ok(())
  489. }
  490. #[test]
  491. fn deserialize_tuple() -> Result<()> {
  492. let expected = ("orb".to_string(), 12u16);
  493. let vec: Vec<u8> = vec![
  494. 0x03, 0x00, 0x00, 0x00, 'o' as u8, 'r' as u8, 'b' as u8,
  495. 0x0C, 0x00
  496. ];
  497. let result = from_vec(&vec);
  498. assert_eq!(expected, result?);
  499. Ok(())
  500. }
  501. #[test]
  502. fn deserialize_map() -> Result<()> {
  503. let expected: HashMap<String, u8> = HashMap::from([
  504. ("blue".to_string(), 5), ("red".to_string(), 7)
  505. ]);
  506. let vec: Vec<u8> = vec![
  507. 0x02, 0x00, 0x00, 0x00, // Number of entries in the map.
  508. 0x04, 0x00, 0x00, 0x00, 'b' as u8, 'l' as u8, 'u' as u8, 'e' as u8, // First key.
  509. 0x05, // First value.
  510. 0x03, 0x00, 0x00, 0x00, 'r' as u8, 'e' as u8, 'd' as u8, // Second key.
  511. 0x07, // Second value.
  512. ];
  513. let result = from_vec(&vec);
  514. assert_eq!(expected, result?);
  515. Ok(())
  516. }
  517. #[test]
  518. fn deserialize_struct() -> Result<()> {
  519. #[derive(Debug, PartialEq, Deserialize)]
  520. struct Order {
  521. customer: String,
  522. item_id: u16,
  523. quantity: u8
  524. }
  525. let expected = Order {
  526. customer: "Bob".to_string(),
  527. item_id: 256,
  528. quantity: 255
  529. };
  530. let vec: Vec<u8> = vec![
  531. 0x03, 0x00, 0x00, 0x00, 'B' as u8, 'o' as u8, 'b' as u8,
  532. 0x00, 0x01,
  533. 0xFF
  534. ];
  535. let result = from_vec(&vec);
  536. assert_eq!(expected, result?);
  537. Ok(())
  538. }
  539. #[test]
  540. fn deserialize_enum() -> Result<()> {
  541. #[derive(Debug, PartialEq, Deserialize)]
  542. enum Emotions { Anguish, Catharsis }
  543. let vec: Vec<u8> = vec![0x01, 0x00];
  544. let result = from_vec(&vec);
  545. assert_eq!(Emotions::Catharsis, result?);
  546. Ok(())
  547. }
  548. #[test]
  549. fn deserialize_struct_variant() -> Result<()> {
  550. #[derive(Debug, PartialEq, Deserialize)]
  551. enum Vector {
  552. Dim2(i32, i32),
  553. Dim3(i32, i32, i32)
  554. }
  555. let expected = Vector::Dim3(1, -1, -2);
  556. let vec: Vec<u8> = vec![
  557. 0x01, 0x00, // The variant index.
  558. 0x01, 0x00, 0x00, 0x00, // The first entry.
  559. 0xFF, 0xFF, 0xFF, 0xFF, // The second entry.
  560. 0xFE, 0xFF, 0xFF, 0xFF // The last entry.
  561. ];
  562. let result = from_vec(&vec);
  563. assert_eq!(expected, result?);
  564. Ok(())
  565. }
  566. }