de.rs 22 KB

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