107 lines
2.7 KiB
Rust
107 lines
2.7 KiB
Rust
use valuable::{NamedValues, Valuable, Value, Visit};
|
|
|
|
struct Print(String);
|
|
|
|
impl Print {
|
|
fn indent(&self) -> Print {
|
|
Print(format!("{} ", self.0))
|
|
}
|
|
}
|
|
|
|
impl Visit for Print {
|
|
fn visit_value(&mut self, value: Value<'_>) {
|
|
match value {
|
|
Value::Structable(v) => {
|
|
let def = v.definition();
|
|
// Print the struct name
|
|
println!("{}{}:", self.0, def.name());
|
|
|
|
// Visit fields
|
|
let mut visit = self.indent();
|
|
v.visit(&mut visit);
|
|
}
|
|
Value::Enumerable(v) => {
|
|
let def = v.definition();
|
|
let variant = v.variant();
|
|
// Print the enum name
|
|
println!("{}{}::{}:", self.0, def.name(), variant.name());
|
|
|
|
// Visit fields
|
|
let mut visit = self.indent();
|
|
v.visit(&mut visit);
|
|
}
|
|
Value::Listable(v) => {
|
|
println!("{}", self.0);
|
|
|
|
// Visit fields
|
|
let mut visit = self.indent();
|
|
v.visit(&mut visit);
|
|
}
|
|
Value::Mappable(v) => {
|
|
println!("{}", self.0);
|
|
|
|
// Visit fields
|
|
let mut visit = self.indent();
|
|
v.visit(&mut visit);
|
|
}
|
|
// Primitive or unknown type, just render Debug
|
|
v => println!("{:?}", v),
|
|
}
|
|
}
|
|
|
|
fn visit_named_fields(&mut self, named_values: &NamedValues<'_>) {
|
|
for (field, value) in named_values {
|
|
print!("{}- {}: ", self.0, field.name());
|
|
value.visit(self);
|
|
}
|
|
}
|
|
|
|
fn visit_unnamed_fields(&mut self, values: &[Value<'_>]) {
|
|
for value in values {
|
|
print!("{}- ", self.0);
|
|
value.visit(self);
|
|
}
|
|
}
|
|
|
|
fn visit_entry(&mut self, key: Value<'_>, value: Value<'_>) {
|
|
print!("{}- {:?}: ", self.0, key);
|
|
value.visit(self);
|
|
}
|
|
}
|
|
|
|
#[derive(Valuable)]
|
|
struct Person {
|
|
name: String,
|
|
age: u32,
|
|
addresses: Vec<Address>,
|
|
}
|
|
|
|
#[derive(Valuable)]
|
|
struct Address {
|
|
street: String,
|
|
city: String,
|
|
zip: String,
|
|
}
|
|
|
|
fn main() {
|
|
let person = Person {
|
|
name: "Angela Ashton".to_string(),
|
|
age: 31,
|
|
addresses: vec![
|
|
Address {
|
|
street: "123 1st Ave".to_string(),
|
|
city: "Townsville".to_string(),
|
|
zip: "12345".to_string(),
|
|
},
|
|
Address {
|
|
street: "555 Main St.".to_string(),
|
|
city: "New Old Town".to_string(),
|
|
zip: "55555".to_string(),
|
|
},
|
|
],
|
|
};
|
|
|
|
let mut print = Print("".to_string());
|
|
valuable::visit(&person, &mut print);
|
|
}
|