Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.05 KB | None | 0 0
  1. use serde::de::{Deserialize, Deserializer, MapAccess, SeqAccess, Visitor};
  2. use serde::ser::{Serialize, SerializeStruct, Serializer};
  3. use serde_derive::*;
  4. use std::collections::BTreeSet;
  5. use std::fmt;
  6. use failure::Error;
  7.  
  8. fn main() -> Result<(), Error> {
  9. let mut t = BTreeSet::new();
  10. t.insert(FieldType::A(34));
  11. t.insert(FieldType::F(true));
  12.  
  13. let tt = Wrap(t);
  14. println!("in {:?}", tt);
  15. let s = serde_json::to_string(&tt)?;
  16. println!("to json '{}'", s);
  17. let ttt: Wrap = serde_json::from_str(&s)?;
  18. println!("from json {:?}", ttt);
  19.  
  20.  
  21. // let bson = bson::to_bson(&t);
  22. // println!("Encoded bson: {:?}", bson);
  23. // let result: Wrap = bson::from_bson(bson?)?;
  24. // println!("Decode: bson {:?}", result);
  25. // assert_eq!(result, *msg);
  26.  
  27. Ok(())
  28. }
  29.  
  30. macro_rules! tagged_enum {
  31. ($name:ident { $( $variant:ident ( $content:ty ), )* }) => {
  32. #[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, PartialOrd, Ord)]
  33. enum $name {
  34. $(
  35. $variant($content),
  36. )*
  37. }
  38.  
  39. #[derive(Debug, Eq, PartialEq, Hash, Clone, PartialOrd, Ord)]
  40. struct Wrap(BTreeSet<$name>);
  41.  
  42. impl Serialize for Wrap {
  43. fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  44. where
  45. S: Serializer,
  46. {
  47. let mut state = serializer.serialize_struct(stringify!($name), self.0.len())?;
  48. for e in &self.0 {
  49. match e {
  50. $(
  51. $name::$variant(v) => state.serialize_field(stringify!($variant), &v)?,
  52. )*
  53. }
  54. }
  55. state.end()
  56. }
  57. }
  58.  
  59.  
  60. impl<'de> Deserialize<'de> for Wrap {
  61. fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  62. where
  63. D: Deserializer<'de>,
  64. {
  65. #[derive(Deserialize, Debug)]
  66. #[serde(field_identifier)]
  67. enum Field {
  68. $(
  69. $variant,
  70. )*
  71. };
  72.  
  73. struct WrapVisitor;
  74.  
  75. impl<'de> Visitor<'de> for WrapVisitor {
  76. type Value = Wrap;
  77.  
  78. fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  79. formatter.write_str("struct Wrap")
  80. }
  81.  
  82. fn visit_seq<V>(self, mut seq: V) -> Result<Wrap, V::Error>
  83. where
  84. V: SeqAccess<'de>,
  85. {
  86. let mut s = BTreeSet::new();
  87. log::debug!("visit_seq");
  88. $(
  89. s.insert($name::$variant(seq.next_element()?.ok_or_else(|| serde::de::Error::invalid_length(0, &self))?));
  90. )*
  91. Ok(Wrap(s))
  92. }
  93.  
  94. fn visit_map<V>(self, mut map: V) -> Result<Wrap, V::Error>
  95. where
  96. V: MapAccess<'de>,
  97. {
  98. log::debug!("visit_map");
  99. let mut s = BTreeSet::new();
  100. while let Some(key) = map.next_key()? {
  101. log::debug!("{:?}", key);
  102. match key {
  103. $(
  104. Field::$variant => s.insert($name::$variant(map.next_value()?)),
  105. )*
  106. };
  107. }
  108. Ok(Wrap(s))
  109. }
  110. }
  111.  
  112. const FIELDS: &'static [&'static str] = &[
  113. $(
  114. stringify!($variant),
  115. )*
  116. ];
  117. deserializer.deserialize_struct("Wrap", FIELDS, WrapVisitor)
  118. }
  119. }
  120. }
  121. }
  122.  
  123. tagged_enum!(
  124. FieldType {
  125. A(u8),
  126. B(u16),
  127. C(u16),
  128. D(i32),
  129. E(bool),
  130. F(bool),
  131. G(i8),
  132. H(bool),
  133. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement