use std::fmt::Display;
use anyhow::Result;
use syntree_layout::Layouter;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(non_camel_case_types)]
enum Syntax {
Number,
Plus,
Div,
Mul,
Whitespace,
Operator,
Operation,
}
impl Display for Syntax {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Syntax::Number => "Number",
Syntax::Plus => "Plus",
Syntax::Div => "Div",
Syntax::Mul => "Mul",
Syntax::Whitespace => "Whitespace",
Syntax::Operator => "Operator",
Syntax::Operation => "Operation",
};
write!(f, "{}", s)
}
}
fn main() -> Result<()> {
let source = "256 / 2 + 64 * 2";
let tree = syntree::tree! {
Syntax::Operation => {
Syntax::Number => {
(Syntax::Number, 3),
},
(Syntax::Whitespace, 1),
Syntax::Operator => {
(Syntax::Div, 1),
},
(Syntax::Whitespace, 1),
Syntax::Number => {
(Syntax::Number, 1),
},
(Syntax::Whitespace, 1),
Syntax::Operator => {
(Syntax::Plus, 1),
},
(Syntax::Whitespace, 1),
Syntax::Operation => {
Syntax::Number => {
(Syntax::Number, 2),
},
(Syntax::Whitespace, 1),
Syntax::Operator => {
(Syntax::Mul, 1),
},
(Syntax::Whitespace, 1),
Syntax::Number => {
(Syntax::Number, 1),
},
},
}
};
Layouter::new(&tree)
.with_file_path("examples/example3_1.svg")
.embed_with_source(source)
.map_err(|e| anyhow::anyhow!(e))?
.write()
.map_err(|e| anyhow::anyhow!(e))?;
Layouter::new(&tree)
.with_file_path("examples/example3_2.svg")
.embed_with_source_and_display(source)
.map_err(|e| anyhow::anyhow!(e))?
.write()
.map_err(|e| anyhow::anyhow!(e))
}