1use std::fmt::Display;
31
32use anyhow::Result;
33use syntree_layout::Layouter;
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq)]
36#[allow(non_camel_case_types)]
37enum Syntax {
38 Number,
39 Plus,
40 Div,
41 Mul,
42 Whitespace,
43 Operator,
44 Operation,
45}
46
47impl Display for Syntax {
48 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49 let s = match self {
50 Syntax::Number => "Number",
51 Syntax::Plus => "Plus",
52 Syntax::Div => "Div",
53 Syntax::Mul => "Mul",
54 Syntax::Whitespace => "Whitespace",
55 Syntax::Operator => "Operator",
56 Syntax::Operation => "Operation",
57 };
58 write!(f, "{}", s)
59 }
60}
61
62fn main() -> Result<()> {
63 let source = "256 / 2 + 64 * 2";
64 let tree = syntree::tree! {
65 Syntax::Operation => {
66 Syntax::Number => {
67 (Syntax::Number, 3),
68 },
69 (Syntax::Whitespace, 1),
70 Syntax::Operator => {
71 (Syntax::Div, 1),
72 },
73 (Syntax::Whitespace, 1),
74 Syntax::Number => {
75 (Syntax::Number, 1),
76 },
77 (Syntax::Whitespace, 1),
78 Syntax::Operator => {
79 (Syntax::Plus, 1),
80 },
81 (Syntax::Whitespace, 1),
82 Syntax::Operation => {
83 Syntax::Number => {
84 (Syntax::Number, 2),
85 },
86 (Syntax::Whitespace, 1),
87 Syntax::Operator => {
88 (Syntax::Mul, 1),
89 },
90 (Syntax::Whitespace, 1),
91 Syntax::Number => {
92 (Syntax::Number, 1),
93 },
94 },
95
96 }
97 };
98
99 Layouter::new(&tree)
101 .with_file_path("examples/example3_1.svg")
102 .embed_with_source(source)
103 .map_err(|e| anyhow::anyhow!(e))?
104 .write()
105 .map_err(|e| anyhow::anyhow!(e))?;
106 Layouter::new(&tree)
108 .with_file_path("examples/example3_2.svg")
109 .embed_with_source_and_display(source)
110 .map_err(|e| anyhow::anyhow!(e))?
111 .write()
112 .map_err(|e| anyhow::anyhow!(e))
113}