my_enum_manual/
my_enum_manual.rs

1//! Example of manually implementing Visualize for an enum
2
3use std::fs::File;
4
5use vizz::DataDescription;
6use vizz::Graph;
7use vizz::Value;
8use vizz::Visualize;
9
10enum MyEnum {
11    Plain,
12    WithU8(u8),
13    WithU8AndString(u8, String),
14    WithStruct { my_u8: u8, my_string: String },
15}
16
17impl Visualize for MyEnum {
18    fn data(&self) -> Option<Value> {
19        Some(Value::Owned(
20            match self {
21                MyEnum::Plain => "Plain",
22                MyEnum::WithU8(_) => "WithU8",
23                MyEnum::WithU8AndString(_, _) => "WithU8AndString",
24                MyEnum::WithStruct { .. } => "WithStruct",
25            }
26            .into(),
27        ))
28    }
29
30    fn associated_data(&self) -> Option<Vec<DataDescription>> {
31        match self {
32            MyEnum::Plain => None,
33            MyEnum::WithU8(a) => Some(vec![DataDescription::from(a)]),
34            MyEnum::WithU8AndString(a, b) => {
35                Some(vec![DataDescription::from(a), DataDescription::from(b)])
36            }
37            MyEnum::WithStruct { my_u8, my_string } => Some(vec![
38                DataDescription::from(my_u8).with_label("my_u8"),
39                DataDescription::from(my_string).with_label("my_string"),
40            ]),
41        }
42    }
43}
44
45pub fn main() -> Result<(), Box<dyn std::error::Error>> {
46    // create some values
47    let plain_enum = MyEnum::Plain;
48    let enum_with_u8_and_string = MyEnum::WithU8AndString(8, String::from("hey"));
49    let enum_with_u8 = MyEnum::WithU8(8);
50    let enum_with_named_fields = MyEnum::WithStruct {
51        my_u8: 8,
52        my_string: String::from("hey"),
53    };
54
55    // create file
56    let mut dot_file = File::create("my_enum.dot")?;
57
58    // create graph
59    Graph::new()
60        .set_id("my_enum_visualization")
61        .add_node(&plain_enum)
62        .add_node(&enum_with_named_fields)
63        .add_node(&enum_with_u8)
64        .add_node(&enum_with_u8_and_string)
65        .write_to(&mut dot_file)?;
66
67    Ok(())
68}