]> git.proxmox.com Git - rustc.git/blob - vendor/valuable/examples/print.rs
New upstream version 1.60.0+dfsg1
[rustc.git] / vendor / valuable / examples / print.rs
1 use valuable::{NamedValues, Valuable, Value, Visit};
2
3 struct Print(String);
4
5 impl Print {
6 fn indent(&self) -> Print {
7 Print(format!("{} ", self.0))
8 }
9 }
10
11 impl Visit for Print {
12 fn visit_value(&mut self, value: Value<'_>) {
13 match value {
14 Value::Structable(v) => {
15 let def = v.definition();
16 // Print the struct name
17 println!("{}{}:", self.0, def.name());
18
19 // Visit fields
20 let mut visit = self.indent();
21 v.visit(&mut visit);
22 }
23 Value::Enumerable(v) => {
24 let def = v.definition();
25 let variant = v.variant();
26 // Print the enum name
27 println!("{}{}::{}:", self.0, def.name(), variant.name());
28
29 // Visit fields
30 let mut visit = self.indent();
31 v.visit(&mut visit);
32 }
33 Value::Listable(v) => {
34 println!("{}", self.0);
35
36 // Visit fields
37 let mut visit = self.indent();
38 v.visit(&mut visit);
39 }
40 Value::Mappable(v) => {
41 println!("{}", self.0);
42
43 // Visit fields
44 let mut visit = self.indent();
45 v.visit(&mut visit);
46 }
47 // Primitive or unknown type, just render Debug
48 v => println!("{:?}", v),
49 }
50 }
51
52 fn visit_named_fields(&mut self, named_values: &NamedValues<'_>) {
53 for (field, value) in named_values {
54 print!("{}- {}: ", self.0, field.name());
55 value.visit(self);
56 }
57 }
58
59 fn visit_unnamed_fields(&mut self, values: &[Value<'_>]) {
60 for value in values {
61 print!("{}- ", self.0);
62 value.visit(self);
63 }
64 }
65
66 fn visit_entry(&mut self, key: Value<'_>, value: Value<'_>) {
67 print!("{}- {:?}: ", self.0, key);
68 value.visit(self);
69 }
70 }
71
72 #[derive(Valuable)]
73 struct Person {
74 name: String,
75 age: u32,
76 addresses: Vec<Address>,
77 }
78
79 #[derive(Valuable)]
80 struct Address {
81 street: String,
82 city: String,
83 zip: String,
84 }
85
86 fn main() {
87 let person = Person {
88 name: "Angela Ashton".to_string(),
89 age: 31,
90 addresses: vec![
91 Address {
92 street: "123 1st Ave".to_string(),
93 city: "Townsville".to_string(),
94 zip: "12345".to_string(),
95 },
96 Address {
97 street: "555 Main St.".to_string(),
98 city: "New Old Town".to_string(),
99 zip: "55555".to_string(),
100 },
101 ],
102 };
103
104 let mut print = Print("".to_string());
105 valuable::visit(&person, &mut print);
106 }