Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #[macro_use]
- extern crate serde_derive; // 1.0.70
- extern crate serde; // 1.0.70
- extern crate serde_json; // 1.0.24
- use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor};
- use std::fmt;
- static mut AGE_UPTO: u64 = 0;
- #[derive(Deserialize)]
- struct Person {
- age: u64,
- name: String,
- }
- struct OldestUpTo {
- age: u64,
- list: Vec<Person>,
- }
- impl<'de> Deserialize<'de> for OldestUpTo {
- fn deserialize<D>(deserializer: D) -> Result<OldestUpTo, D::Error>
- where
- D: Deserializer<'de>,
- {
- //
- struct OldestUpToVisitor;
- impl<'de> Visitor<'de> for OldestUpToVisitor {
- type Value = OldestUpTo;
- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- formatter.write_str("an array of objects")
- }
- fn visit_seq<V>(self, mut seq: V) -> Result<OldestUpTo, V::Error>
- where
- V: SeqAccess<'de>,
- {
- let mut oldest = OldestUpTo {
- age: 0,
- list: vec![],
- };
- while let Some(person) = seq.next_element::<Person>()? {
- if person.age <= unsafe { AGE_UPTO } && person.age > oldest.age {
- oldest.age = person.age;
- oldest.list.clear();
- oldest.list.push(person);
- } else if person.age == oldest.age {
- oldest.list.push(person);
- }
- }
- Ok(oldest)
- }
- }
- deserializer.deserialize_seq(OldestUpToVisitor)
- }
- }
- fn main() {
- let json = r#"[
- {
- "age": 42,
- "name": "André"
- },
- {
- "age": 53,
- "name": "Bruno"
- },
- {
- "age": 53,
- "name": "Carlos"
- },
- {
- "age": 52,
- "name": "Diego"
- },
- {
- "age": 59,
- "name": "Eduardo"
- }
- ]"#;
- unsafe {
- AGE_UPTO = 55;
- }
- let oldest: OldestUpTo = serde_json::from_str(json).unwrap();
- for p in oldest.list {
- println!("Age: {}, Name: {}", p.age, p.name);
- }
- }
Add Comment
Please, Sign In to add comment