ser.rs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. use std::io::Write;
  2. use std::convert::TryFrom;
  3. use serde::{
  4. ser::{
  5. self,
  6. SerializeSeq,
  7. SerializeTuple,
  8. SerializeTupleStruct,
  9. SerializeTupleVariant,
  10. SerializeMap,
  11. SerializeStruct,
  12. SerializeStructVariant,
  13. },
  14. Serialize,
  15. };
  16. use super::error::{Error, Result, MapError};
  17. type Ok = ();
  18. pub struct Serializer<T: Write> {
  19. output: T,
  20. }
  21. pub fn to_vec<T: Serialize + ?Sized>(value: &T) -> Result<Vec<u8>> {
  22. let mut serializer = Serializer { output: Vec::new()};
  23. value.serialize(&mut serializer)?;
  24. Ok(serializer.output)
  25. }
  26. fn try_convert(len: Option<usize>) -> Result<u32> {
  27. match len {
  28. Some(count) => {
  29. let length = u32::try_from(count).or_else(|_| Err(Error::SequenceTooLong(count)))?;
  30. Ok(length)
  31. },
  32. None => Err(Error::UnknownLength),
  33. }
  34. }
  35. impl<'a, T: Write> ser::Serializer for &'a mut Serializer<T> {
  36. type Ok = Ok;
  37. type Error = Error;
  38. type SerializeSeq = Self;
  39. type SerializeTuple = Self;
  40. type SerializeTupleVariant = Self;
  41. type SerializeTupleStruct = Self;
  42. type SerializeMap = Self;
  43. type SerializeStruct = Self;
  44. type SerializeStructVariant = Self;
  45. /// A bool is serialized by writing the byte 1 if true and 0 if false.
  46. fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
  47. self.output.write_all(&[if v { 1 } else { 0 }]).map_error()?;
  48. Ok(())
  49. }
  50. /// The output format of a signed byte is two's complement, so we can just output
  51. /// Rust's binary representation.
  52. fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
  53. self.output.write_all(&v.to_le_bytes()).map_error()?;
  54. Ok(())
  55. }
  56. /// The output format of a signed integer is two's complement, so we can just output
  57. /// Rust's binary representation in little endian order.
  58. fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
  59. self.output.write_all(&v.to_le_bytes()).map_error()?;
  60. Ok(())
  61. }
  62. /// The output format of a signed integer is two's complement, so we can just output
  63. /// Rust's binary representation in little endian order.
  64. fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
  65. self.output.write_all(&v.to_le_bytes()).map_error()?;
  66. Ok(())
  67. }
  68. /// The output format of a signed integer is two's complement, so we can just output
  69. /// Rust's binary representation in little endian order.
  70. fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
  71. self.output.write_all(&v.to_le_bytes()).map_error()?;
  72. Ok(())
  73. }
  74. /// The output format of a signed integer is two's complement, so we can just output
  75. /// Rust's binary representation in little endian order.
  76. fn serialize_i128(self, v: i128) -> Result<Self::Ok> {
  77. self.output.write_all(&v.to_le_bytes()).map_error()?;
  78. Ok(())
  79. }
  80. /// The given byte is written directly to the output.
  81. fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
  82. self.output.write_all(&[v]).map_error()?;
  83. Ok(())
  84. }
  85. /// The underlying bytes of the given unsigned integer are written to the output in little
  86. /// endian order.
  87. fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
  88. self.output.write_all(&v.to_le_bytes()).map_error()?;
  89. Ok(())
  90. }
  91. /// The underlying bytes of the given unsigned integer are written to the output in little
  92. /// endian order.
  93. fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
  94. self.output.write_all(&v.to_le_bytes()).map_error()?;
  95. Ok(())
  96. }
  97. /// The underlying bytes of the given unsigned integer are written to the output in little
  98. /// endian order.
  99. fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
  100. self.output.write_all(&v.to_le_bytes()).map_error()?;
  101. Ok(())
  102. }
  103. /// The underlying bytes of the given unsigned integer are written to the output in little
  104. /// endian order.
  105. fn serialize_u128(self, v: u128) -> Result<Self::Ok> {
  106. self.output.write_all(&v.to_le_bytes()).map_error()?;
  107. Ok(())
  108. }
  109. /// Since the output format is IEEE 754, we can just write the underlying bytes to the output
  110. /// in little endian order.
  111. fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
  112. self.output.write_all(&v.to_le_bytes()).map_error()?;
  113. Ok(())
  114. }
  115. /// Since the output format is IEEE 754, we can just write the underlying bytes to the output
  116. /// in little endian order.
  117. fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
  118. self.output.write_all(&v.to_le_bytes()).map_error()?;
  119. Ok(())
  120. }
  121. /// The given char is cast to a u8 then written to the output.
  122. fn serialize_char(self, c: char) -> Result<Self::Ok> {
  123. self.output.write_all(&[c as u8]).map_error()?;
  124. Ok(())
  125. }
  126. /// A slice of bytes is stored by first writing its length (in LE order) and then the slice.
  127. fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok> {
  128. let len = v.len() as u32;
  129. self.output.write_all(&len.to_le_bytes()).map_error()?;
  130. self.output.write_all(v).map_error()?;
  131. Ok(())
  132. }
  133. /// A str is just serialized as a sequence of UTF8 bytes.
  134. fn serialize_str(self, v: &str) -> Result<Self::Ok> {
  135. self.serialize_bytes(v.as_bytes())
  136. }
  137. /// The none variant is stored as a zero byte.
  138. fn serialize_none(self) -> Result<Self::Ok> {
  139. self.output.write_all(&[0]).map_error()?;
  140. Ok(())
  141. }
  142. /// A some variant is just stored using the representation of its value.
  143. fn serialize_some<U: ?Sized + Serialize>(self, value: &U) -> Result<Self::Ok> {
  144. value.serialize(self)?;
  145. Ok(())
  146. }
  147. /// The unit is a type which can be represented with zero bytes, so we faithfully represent it
  148. /// as nothing.
  149. fn serialize_unit(self) -> Result<()> {
  150. Ok(())
  151. }
  152. /// Forwards to serialize_unit.
  153. fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
  154. self.serialize_unit()
  155. }
  156. /// The index of the unit variant is written to the output.
  157. fn serialize_unit_variant(
  158. self, _name: &'static str, variant_index: u32, _variant: &'static str
  159. ) -> Result<Self::Ok> {
  160. self.serialize_u32(variant_index)?;
  161. Ok(())
  162. }
  163. /// The value of the newtype struct is serialized and its name is ignored.
  164. fn serialize_newtype_struct<U: ?Sized + Serialize>(
  165. self, _name: &'static str, value: &U
  166. ) -> Result<Self::Ok> {
  167. value.serialize(self)?;
  168. Ok(())
  169. }
  170. /// The index of the variant is serialized and written out, followed by the serialization of
  171. /// its value.
  172. fn serialize_newtype_variant<U: ?Sized + Serialize>(
  173. self, _name: &'static str, variant_index: u32, _variant: &'static str, value: &U
  174. ) -> Result<Self::Ok> {
  175. self.serialize_u32(variant_index)?;
  176. value.serialize(self)?;
  177. Ok(())
  178. }
  179. fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
  180. let length = try_convert(len)?;
  181. self.serialize_u32(length)?;
  182. Ok(self)
  183. }
  184. /// A tuples length is not stored, only its entries.
  185. fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
  186. Ok(self)
  187. }
  188. /// A tuple struct is serialized the same way as a tuple, its name is ignore.
  189. fn serialize_tuple_struct(
  190. self, _name: &'static str, _len: usize
  191. ) -> Result<Self::SerializeTupleStruct> {
  192. Ok(self)
  193. }
  194. /// The variant index is stored before the tuples values.
  195. fn serialize_tuple_variant(
  196. self, _name: &'static str, variant_index: u32, _variant: &'static str, _len: usize
  197. ) -> Result<Self::SerializeTupleStruct> {
  198. self.serialize_u32(variant_index)?;
  199. Ok(self)
  200. }
  201. /// The number of entries in the map is stored as a u32 prior to serializing the key value
  202. /// pairs in the map. If there are more entries than a u32 can represent, then an error is
  203. /// returned.
  204. fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
  205. let length = try_convert(len)?;
  206. self.serialize_u32(length)?;
  207. Ok(self)
  208. }
  209. /// Since the members of a struct a known at compile time, no additional information is stored.
  210. fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
  211. Ok(self)
  212. }
  213. /// The variant index is stored before the struct's members.
  214. fn serialize_struct_variant(
  215. self, _name: &'static str, variant_index: u32, _variant: &'static str, _len: usize
  216. ) -> Result<Self::SerializeStructVariant> {
  217. self.serialize_u32(variant_index)?;
  218. Ok(self)
  219. }
  220. }
  221. impl<'a, T: Write> SerializeSeq for &'a mut Serializer<T> {
  222. type Ok = Ok;
  223. type Error = Error;
  224. fn serialize_element<U: ?Sized + Serialize>(&mut self, value: &U) -> Result<Ok> {
  225. value.serialize(&mut **self)?;
  226. Ok(())
  227. }
  228. /// No marker is added to the end of the sequence because we know its length.
  229. fn end(self) -> Result<Ok> {
  230. Ok(())
  231. }
  232. }
  233. impl<'a, T: Write> SerializeTuple for &'a mut Serializer<T> {
  234. type Ok = Ok;
  235. type Error = Error;
  236. fn serialize_element<U: ?Sized + Serialize>(&mut self, value: &U) -> Result<Ok> {
  237. value.serialize(&mut **self)?;
  238. Ok(())
  239. }
  240. fn end(self) -> Result<Ok> {
  241. Ok(())
  242. }
  243. }
  244. impl<'a, T: Write> SerializeTupleStruct for &'a mut Serializer<T> {
  245. type Ok = Ok;
  246. type Error = Error;
  247. fn serialize_field<U: ?Sized + Serialize>(&mut self, value: &U) -> Result<Ok> {
  248. value.serialize(&mut **self)?;
  249. Ok(())
  250. }
  251. fn end(self) -> Result<Ok> {
  252. Ok(())
  253. }
  254. }
  255. impl<'a, T: Write> SerializeTupleVariant for &'a mut Serializer<T> {
  256. type Ok = Ok;
  257. type Error = Error;
  258. fn serialize_field<U: ?Sized + Serialize>(&mut self, value: &U) -> Result<Ok> {
  259. value.serialize(&mut **self)?;
  260. Ok(())
  261. }
  262. fn end(self) -> Result<Ok> {
  263. Ok(())
  264. }
  265. }
  266. impl<'a, T: Write> SerializeMap for &'a mut Serializer<T> {
  267. type Ok = Ok;
  268. type Error = Error;
  269. fn serialize_key<U: ?Sized + Serialize>(&mut self, key: &U) -> Result<Ok> {
  270. key.serialize(&mut **self)?;
  271. Ok(())
  272. }
  273. fn serialize_value<U: ?Sized + Serialize>(&mut self, value: &U) -> Result<Ok> {
  274. value.serialize(&mut **self)?;
  275. Ok(())
  276. }
  277. fn end(self) -> Result<Ok> {
  278. Ok(())
  279. }
  280. }
  281. impl<'a, T: Write> SerializeStruct for &'a mut Serializer<T> {
  282. type Ok = Ok;
  283. type Error = Error;
  284. fn serialize_field<U: ?Sized + Serialize>(
  285. &mut self, _key: &'static str, value: &U) -> Result<Ok> {
  286. value.serialize(&mut **self)?;
  287. Ok(())
  288. }
  289. fn end(self) -> Result<Ok> {
  290. Ok(())
  291. }
  292. }
  293. impl<'a, T: Write> SerializeStructVariant for &'a mut Serializer<T> {
  294. type Ok = Ok;
  295. type Error = Error;
  296. fn serialize_field<U: ?Sized + Serialize>(
  297. &mut self, _key: &'static str, value: &U) -> Result<Ok> {
  298. value.serialize(&mut **self)?;
  299. Ok(())
  300. }
  301. fn end(self) -> Result<Ok> {
  302. Ok(())
  303. }
  304. }
  305. mod test {
  306. use super::Result;
  307. use super::super::super::{
  308. VersionedBlock,
  309. Block,
  310. ReadCap,
  311. WriteCap,
  312. Certificate,
  313. Hash,
  314. Signature,
  315. EnvelopedKey
  316. };
  317. use serde::Serialize;
  318. #[test]
  319. fn serialize_bool() -> Result<()> {
  320. {
  321. let buffer = super::to_vec(&true)?;
  322. assert_eq!(vec![1], buffer);
  323. }
  324. {
  325. let buffer = super::to_vec(&false)?;
  326. assert_eq!(vec![0], buffer);
  327. }
  328. Ok(())
  329. }
  330. #[test]
  331. fn serialize_i8() -> Result<()> {
  332. {
  333. let buffer = super::to_vec(&5i8)?;
  334. assert_eq!(vec![0b00000101], buffer);
  335. }
  336. {
  337. let value: i8 = -1;
  338. let buffer = super::to_vec(&value)?;
  339. assert_eq!(vec![0b11111111], buffer);
  340. }
  341. Ok(())
  342. }
  343. #[test]
  344. fn serialize_i16() -> Result<()> {
  345. {
  346. let buffer = super::to_vec(&1i16)?;
  347. assert_eq!(vec![0x01, 0x00], buffer);
  348. }
  349. {
  350. let value: i16 = -2;
  351. let buffer = super::to_vec(&value)?;
  352. assert_eq!(vec![0xFE, 0xFF], buffer);
  353. }
  354. Ok(())
  355. }
  356. #[test]
  357. fn serialize_i32() -> Result<()> {
  358. {
  359. let buffer = super::to_vec(&1i32)?;
  360. assert_eq!(vec![0x01, 0x00, 0x00, 0x00], buffer);
  361. }
  362. {
  363. let value: i32 = -2;
  364. let buffer = super::to_vec(&value)?;
  365. assert_eq!(vec![0xFE, 0xFF, 0xFF, 0xFF], buffer);
  366. }
  367. Ok(())
  368. }
  369. #[test]
  370. fn serialize_i64() -> Result<()> {
  371. {
  372. let buffer = super::to_vec(&1i64)?;
  373. assert_eq!(vec![0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], buffer);
  374. }
  375. {
  376. let value: i64 = -2;
  377. let buffer = super::to_vec(&value)?;
  378. assert_eq!(vec![0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], buffer);
  379. }
  380. Ok(())
  381. }
  382. #[test]
  383. fn serialize_i128() -> Result<()> {
  384. {
  385. let buffer = super::to_vec(&1i128)?;
  386. assert_eq!(vec![0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], buffer);
  387. }
  388. {
  389. let value: i128 = -2;
  390. let buffer = super::to_vec(&value)?;
  391. assert_eq!(vec![0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], buffer);
  392. }
  393. Ok(())
  394. }
  395. #[test]
  396. fn serialize_u8() -> Result<()> {
  397. let value: u8 = 42;
  398. let buffer = super::to_vec(&value)?;
  399. assert_eq!(vec![value], buffer);
  400. Ok(())
  401. }
  402. #[test]
  403. fn serialize_u16() -> Result<()> {
  404. let buffer = super::to_vec(&1u16)?;
  405. assert_eq!(vec![0x01, 0x00], buffer);
  406. Ok(())
  407. }
  408. #[test]
  409. fn serialize_u32() -> Result<()> {
  410. let buffer = super::to_vec(&1u32)?;
  411. assert_eq!(vec![0x01, 0x00, 0x00, 0x00], buffer);
  412. Ok(())
  413. }
  414. #[test]
  415. fn serialize_u64() -> Result<()> {
  416. let buffer = super::to_vec(&1u64)?;
  417. assert_eq!(vec![0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], buffer);
  418. Ok(())
  419. }
  420. #[test]
  421. fn serialize_u128() -> Result<()> {
  422. let buffer = super::to_vec(&1u128)?;
  423. assert_eq!(vec![0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], buffer);
  424. Ok(())
  425. }
  426. #[test]
  427. fn serialize_f32() -> Result<()> {
  428. let buffer = super::to_vec(&0.15625f32)?;
  429. assert_eq!(vec![0x00, 0x00, 0x20, 0x3E], buffer);
  430. Ok(())
  431. }
  432. #[test]
  433. fn serialize_f64() -> Result<()> {
  434. let buffer = super::to_vec(&1f64)?;
  435. assert_eq!(vec![0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F], buffer);
  436. Ok(())
  437. }
  438. #[test]
  439. fn serialize_char() -> Result<()> {
  440. let c: char = '*';
  441. let buffer = super::to_vec(&c)?;
  442. assert_eq!(vec![42], buffer);
  443. Ok(())
  444. }
  445. #[test]
  446. fn serialize_bytes() -> Result<()> {
  447. let mut bytes: Vec<u8> = vec![41, 23, 72, 61];
  448. let buffer = super::to_vec(bytes.as_slice())?;
  449. let length = bytes.len() as u32;
  450. let mut expected = length.to_le_bytes().to_vec();
  451. expected.append(&mut bytes);
  452. assert_eq!(expected, buffer);
  453. Ok(())
  454. }
  455. #[test]
  456. fn serialize_str() -> Result<()> {
  457. let message = "vapid 😑";
  458. let buffer = super::to_vec(message)?;
  459. assert_eq!(vec![10, 0, 0, 0, 118, 97, 112, 105, 100, 32, 240, 159, 152, 145], buffer);
  460. Ok(())
  461. }
  462. #[test]
  463. fn serialize_none() -> Result<()> {
  464. let none: Option<i32> = Option::None;
  465. let buffer = super::to_vec(&none)?;
  466. assert_eq!(vec![0], buffer);
  467. Ok(())
  468. }
  469. #[test]
  470. fn serialize_some() -> Result<()> {
  471. // Sometimes I use decimal sometimes I use hex. So what, what to fight about it?
  472. let some: Option<i32> = Option::Some(0x02D8);
  473. let buffer = super::to_vec(&some)?;
  474. assert_eq!(vec![0xD8, 0x02, 0x00, 0x00], buffer);
  475. Ok(())
  476. }
  477. #[test]
  478. fn serialize_unit() -> Result<()> {
  479. let buffer = super::to_vec(&())?;
  480. let expected: Vec<u8> = Vec::new();
  481. assert_eq!(expected, buffer);
  482. Ok(())
  483. }
  484. #[test]
  485. fn serialize_unit_struct() -> Result<()> {
  486. #[derive(Serialize)]
  487. struct UnitStruct;
  488. let test = UnitStruct {};
  489. let buffer = super::to_vec(&test)?;
  490. let expected: Vec<u8> = Vec::new();
  491. assert_eq!(expected, buffer);
  492. Ok(())
  493. }
  494. #[test]
  495. fn serialize_unit_struct_variant() -> Result<()> {
  496. #[derive(Serialize)]
  497. enum UnitStructVariant {
  498. Zeroth {},
  499. First {},
  500. Second {},
  501. Third {}
  502. }
  503. let test = UnitStructVariant::Second {};
  504. let buffer = super::to_vec(&test)?;
  505. assert_eq!(vec![2, 0, 0, 0], buffer);
  506. Ok(())
  507. }
  508. #[test]
  509. fn serialize_newtype_struct() -> Result<()> {
  510. #[derive(Serialize)]
  511. struct Score(u16);
  512. let score = Score(512);
  513. let buffer = super::to_vec(&score)?;
  514. assert_eq!(vec![0x00, 0x02], buffer);
  515. Ok(())
  516. }
  517. #[test]
  518. fn serialize_newtype_variant() -> Result<()> {
  519. #[derive(Serialize)]
  520. enum Currency {
  521. Usd(i32),
  522. Btc(i32),
  523. Fil(i32),
  524. Eth(i32)
  525. }
  526. let value = Currency::Fil(1024);
  527. let buffer = super::to_vec(&value)?;
  528. let expected = vec![
  529. 0x02, 0x00, 0x00, 0x00, // The variant index.
  530. 0x00, 0x04, 0x00, 0x00 // The value contained within.
  531. ];
  532. assert_eq!(expected, buffer);
  533. Ok(())
  534. }
  535. #[test]
  536. fn serialize_tuple() -> Result<()> {
  537. let value = (5u16, -1i8);
  538. let buffer = super::to_vec(&value)?;
  539. assert_eq!(vec![0x05, 0x00, 0xFF], buffer);
  540. Ok(())
  541. }
  542. #[test]
  543. fn serialize_tuple_struct() -> Result<()> {
  544. #[derive(Serialize)]
  545. struct Contrived(i8, String);
  546. let value = Contrived(-2, "-2".to_string());
  547. let buffer = super::to_vec(&value)?;
  548. let expected = vec![
  549. 0xFE, // The value -2.
  550. 0x02, 0x00, 0x00, 0x00, // The length of the string.
  551. 0x2D, 0x32 // The characters '-' and '2'.
  552. ];
  553. assert_eq!(expected, buffer);
  554. Ok(())
  555. }
  556. }