summaryrefslogtreecommitdiffstats
path: root/vendor/valuable/examples/print.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /vendor/valuable/examples/print.rs
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/valuable/examples/print.rs')
-rw-r--r--vendor/valuable/examples/print.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/vendor/valuable/examples/print.rs b/vendor/valuable/examples/print.rs
new file mode 100644
index 000000000..b6998d37a
--- /dev/null
+++ b/vendor/valuable/examples/print.rs
@@ -0,0 +1,106 @@
+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);
+}