layout/gv/parser/
printer.rs1use super::ast;
4
5fn print_node_id(n: &ast::NodeId, indent: usize) {
6 print!("{}", " ".repeat(indent));
7 if let Option::Some(port) = &n.port {
8 println!("{}:{}", n.name, port);
9 } else {
10 println!("{}", n.name)
11 }
12}
13fn print_arrow(k: &ast::ArrowKind, indent: usize) {
14 print!("{}", " ".repeat(indent));
15 match k {
16 ast::ArrowKind::Arrow => {
17 println!("->");
18 }
19 ast::ArrowKind::Line => {
20 println!("--");
21 }
22 }
23}
24fn print_attribute(a: &str, b: &str, indent: usize, i: usize) {
25 print!("{}", " ".repeat(indent));
26 println!("{})\"{}\" = \"{}\"", i, a, b);
27}
28fn print_attribute_list(ll: &ast::AttributeList, indent: usize) {
29 for (i, att) in ll.list.iter().enumerate() {
30 print_attribute(&att.0, &att.1, indent, i);
31 }
32}
33fn print_edge(e: &ast::EdgeStmt, indent: usize) {
34 print_node_id(&e.from, indent + 1);
35 for dest in &e.to {
36 print_arrow(&dest.1, indent + 1);
37 print_node_id(&dest.0, indent + 1);
38 }
39 print_attribute_list(&e.list, indent + 1);
40}
41fn print_node(n: &ast::NodeStmt, indent: usize) {
42 print!("Node {}", " ".repeat(indent));
43 print_node_id(&n.id, indent + 1);
44 print_attribute_list(&n.list, indent + 1);
45}
46fn print_att(att: &ast::AttrStmt, indent: usize) {
47 print!("{}", " ".repeat(indent));
48
49 match att.target {
50 ast::AttrStmtTarget::Graph => {
51 println!("Attribute Graph:");
52 }
53 ast::AttrStmtTarget::Node => {
54 println!("Attribute Node:");
55 }
56 ast::AttrStmtTarget::Edge => {
57 println!("Attribute Edge:");
58 }
59 }
60 print_attribute_list(&att.list, indent + 1);
61}
62
63fn print_stmt(stmt: &ast::Stmt, indent: usize) {
64 match stmt {
65 ast::Stmt::Edge(e) => {
66 print_edge(e, indent);
67 }
68 ast::Stmt::Node(n) => {
69 print_node(n, indent);
70 }
71 ast::Stmt::Attribute(a) => {
72 print_att(a, indent);
73 }
74 ast::Stmt::SubGraph(g) => {
75 print_graph(g, indent);
76 }
77 }
78}
79
80fn print_graph(graph: &ast::Graph, indent: usize) {
81 print!("{}", " ".repeat(indent));
82 println!("Graph: {}", graph.name);
83 for stmt in &graph.list.list {
84 print_stmt(stmt, indent + 1);
85 }
86}
87
88pub fn dump_ast(graph: &ast::Graph) {
89 print_graph(graph, 0);
90}