Guest User

Untitled

a guest
Aug 14th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. #[macro_use]
  2. extern crate serde_derive; // 1.0.70
  3. extern crate serde; // 1.0.70
  4. extern crate serde_json; // 1.0.24
  5.  
  6. use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor};
  7. use std::fmt;
  8.  
  9. static mut AGE_UPTO: u64 = 0;
  10.  
  11. #[derive(Deserialize)]
  12. struct Person {
  13. age: u64,
  14. name: String,
  15. }
  16.  
  17. struct OldestUpTo {
  18. age: u64,
  19. list: Vec<Person>,
  20. }
  21.  
  22. impl<'de> Deserialize<'de> for OldestUpTo {
  23. fn deserialize<D>(deserializer: D) -> Result<OldestUpTo, D::Error>
  24. where
  25. D: Deserializer<'de>,
  26. {
  27. //
  28. struct OldestUpToVisitor;
  29.  
  30. impl<'de> Visitor<'de> for OldestUpToVisitor {
  31. type Value = OldestUpTo;
  32.  
  33. fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
  34. formatter.write_str("an array of objects")
  35. }
  36.  
  37. fn visit_seq<V>(self, mut seq: V) -> Result<OldestUpTo, V::Error>
  38. where
  39. V: SeqAccess<'de>,
  40. {
  41. let mut oldest = OldestUpTo {
  42. age: 0,
  43. list: vec![],
  44. };
  45.  
  46. while let Some(person) = seq.next_element::<Person>()? {
  47. if person.age <= unsafe { AGE_UPTO } && person.age > oldest.age {
  48. oldest.age = person.age;
  49. oldest.list.clear();
  50. oldest.list.push(person);
  51. } else if person.age == oldest.age {
  52. oldest.list.push(person);
  53. }
  54. }
  55.  
  56. Ok(oldest)
  57. }
  58. }
  59.  
  60. deserializer.deserialize_seq(OldestUpToVisitor)
  61. }
  62. }
  63.  
  64. fn main() {
  65. let json = r#"[
  66. {
  67. "age": 42,
  68. "name": "André"
  69. },
  70. {
  71. "age": 53,
  72. "name": "Bruno"
  73. },
  74. {
  75. "age": 53,
  76. "name": "Carlos"
  77. },
  78. {
  79. "age": 52,
  80. "name": "Diego"
  81. },
  82. {
  83. "age": 59,
  84. "name": "Eduardo"
  85. }
  86. ]"#;
  87.  
  88. unsafe {
  89. AGE_UPTO = 55;
  90. }
  91. let oldest: OldestUpTo = serde_json::from_str(json).unwrap();
  92.  
  93. for p in oldest.list {
  94. println!("Age: {}, Name: {}", p.age, p.name);
  95. }
  96. }
Add Comment
Please, Sign In to add comment