serializable.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. use crate::constants::HAMT_BITMASK_BYTE_SIZE;
  2. use libipld::{
  3. cid::serde::{BytesToCidVisitor, CID_SERDE_PRIVATE_IDENTIFIER},
  4. Cid,
  5. };
  6. use semver::Version;
  7. use serde::{
  8. de::{SeqAccess, Visitor},
  9. Deserialize, Deserializer, Serialize, Serializer,
  10. };
  11. use serde_byte_array::ByteArray;
  12. use serde_bytes::ByteBuf;
  13. use std::marker::PhantomData;
  14. //--------------------------------------------------------------------------------------------------
  15. // Type Definitions
  16. //--------------------------------------------------------------------------------------------------
  17. #[derive(Serialize, Deserialize, Debug, Clone)]
  18. pub struct HamtSerializable<K, V> {
  19. pub(crate) root: NodeSerializable<K, V>,
  20. pub(crate) version: Version,
  21. pub(crate) structure: String,
  22. }
  23. #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
  24. pub struct NodeSerializable<K, V>(
  25. pub(crate) ByteArray<HAMT_BITMASK_BYTE_SIZE>,
  26. pub(crate) Vec<PointerSerializable<K, V>>,
  27. );
  28. #[derive(Debug, Clone, PartialEq)]
  29. pub(crate) enum PointerSerializable<K, V> {
  30. Values(Vec<(K, V)>),
  31. Link(Cid),
  32. }
  33. //--------------------------------------------------------------------------------------------------
  34. // Implementations
  35. //--------------------------------------------------------------------------------------------------
  36. impl<K: Serialize, V: Serialize> Serialize for PointerSerializable<K, V> {
  37. fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
  38. match *self {
  39. Self::Values(ref vec) => vec.serialize(serializer),
  40. Self::Link(ref cid) => {
  41. let value = ByteBuf::from(cid.to_bytes());
  42. serializer.serialize_newtype_struct(CID_SERDE_PRIVATE_IDENTIFIER, &value)
  43. }
  44. }
  45. }
  46. }
  47. impl<'de, K: Deserialize<'de>, V: Deserialize<'de>> Deserialize<'de> for PointerSerializable<K, V> {
  48. fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
  49. struct PointerVisitor<K, V>(PhantomData<(K, V)>);
  50. impl<'de, K: Deserialize<'de>, V: Deserialize<'de>> Visitor<'de> for PointerVisitor<K, V> {
  51. type Value = PointerSerializable<K, V>;
  52. fn expecting(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
  53. write!(
  54. fmt,
  55. "a valid PointerSerializable represented as CID bytes or as a sequence of tuples of keys and values"
  56. )
  57. }
  58. fn visit_newtype_struct<D: Deserializer<'de>>(
  59. self,
  60. deserializer: D,
  61. ) -> Result<Self::Value, D::Error> {
  62. let cid = deserializer.deserialize_bytes(BytesToCidVisitor)?;
  63. Ok(PointerSerializable::Link(cid))
  64. }
  65. fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
  66. let mut values = Vec::new();
  67. while let Some(elem) = seq.next_element::<(K, V)>()? {
  68. values.push(elem);
  69. }
  70. Ok(PointerSerializable::Values(values))
  71. }
  72. }
  73. let visitor = PointerVisitor(PhantomData);
  74. deserializer.deserialize_any(visitor)
  75. }
  76. }
  77. #[cfg(test)]
  78. mod tests {
  79. use super::*;
  80. use testresult::TestResult;
  81. #[test]
  82. fn test_pointer_link_roundtrip() -> TestResult {
  83. let pointers = PointerSerializable::<String, String>::Link(Cid::default());
  84. let bytes = serde_ipld_dagcbor::to_vec(&pointers)?;
  85. let pointers_back: PointerSerializable<String, String> =
  86. serde_ipld_dagcbor::from_slice(&bytes)?;
  87. assert_eq!(pointers, pointers_back);
  88. Ok(())
  89. }
  90. #[test]
  91. fn test_pointer_values_roundtrip() -> TestResult {
  92. let pointers = PointerSerializable::Values(vec![(1, 10), (2, 20), (3, 30)]);
  93. let bytes = serde_ipld_dagcbor::to_vec(&pointers)?;
  94. let pointers_back: PointerSerializable<u32, u32> = serde_ipld_dagcbor::from_slice(&bytes)?;
  95. assert_eq!(pointers, pointers_back);
  96. Ok(())
  97. }
  98. }