Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.21 KB | None | 0 0
  1. use std::fmt;
  2. use std::marker::PhantomData;
  3. use serde::Deserializer;
  4. use serde::Deserialize;
  5.  
  6. #[derive(Deserialize, Debug)]
  7. #[serde(transparent)]
  8. struct DefaultVec {
  9. #[serde(deserialize_with = "deserialize_vec")]
  10. data: Vec<f64>,
  11. }
  12.  
  13. fn deserialize_vec<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
  14. where
  15. D: Deserializer<'de>,
  16. T: Deserialize<'de> + Default,
  17. {
  18. use serde::de::{SeqAccess, Visitor};
  19.  
  20. struct SeqVisitor<T>(PhantomData<T>);
  21.  
  22. impl<'de, T> Visitor<'de> for SeqVisitor<T>
  23. where
  24. T: Deserialize<'de> + Default,
  25. {
  26. type Value = Vec<T>;
  27.  
  28. fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
  29. fmt.write_str("default vec")
  30. }
  31.  
  32. fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
  33. let mut vec = Vec::new();
  34. while let Ok(Some(elem)) = seq.next_element::<Option<T>>() {
  35. vec.push(elem.unwrap_or_default());
  36. }
  37. Ok(vec)
  38. }
  39. }
  40. deserializer.deserialize_seq(SeqVisitor(PhantomData))
  41. }
  42.  
  43.  
  44. fn main() {
  45. let ret = serde_json::from_str::<DefaultVec>("[1.1, 2.2, 3, null, null, 4.5, 5]").unwrap();
  46. dbg!(ret);
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement