de.rs 20 KB

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