use gura::{parse, GuraType};
#[derive(Debug)]
#[allow(dead_code)]
struct TangoSinger {
name: String,
surname: String,
year_of_birth: u16,
}
fn main() {
let gura_string = r##"
# This is a Gura document.
# Array of objects
tango_singers: [
user1:
name: "Carlos"
surname: "Gardel"
year_of_birth: 1890,
user2:
name: "AnĂbal"
surname: "Troilo"
year_of_birth: 1914
]"##;
let parsed = parse(gura_string).unwrap();
if let GuraType::Array(tango_singers) = &parsed["tango_singers"] {
let mut tango_singers_structs: Vec<TangoSinger> =
Vec::with_capacity(tango_singers.capacity());
for tango_singer in tango_singers {
if let GuraType::Object(key_values) = tango_singer {
let (_singer_key, singer_props) = key_values.iter().next().unwrap();
let year_of_birth: u16 = match singer_props["year_of_birth"] {
GuraType::Integer(value) => value as u16,
GuraType::BigInteger(value) => value as u16,
_ => panic!("Gura text is not a valid array of tango singers!"),
};
let my_struct = TangoSinger {
name: singer_props["name"].to_string(),
surname: singer_props["surname"].to_string(),
year_of_birth,
};
tango_singers_structs.push(my_struct);
} else {
panic!("Gura text is not a valid array of tango singers!")
}
}
println!("Tango singers:");
println!("{:#?}", tango_singers_structs);
}
}