brack_parser/
ast.rs

1use brack_sdk_rs::ast::{InnerNode, LeafNode, AST};
2use uuid::Uuid;
3
4pub fn new_document() -> AST {
5    AST::Document(InnerNode {
6        id: Uuid::new_v4().to_string(),
7        children: vec![],
8    })
9}
10
11pub fn new_document_with_children(children: Vec<AST>) -> AST {
12    AST::Document(InnerNode {
13        id: Uuid::new_v4().to_string(),
14        children,
15    })
16}
17
18pub fn new_stmt() -> AST {
19    AST::Stmt(InnerNode {
20        id: Uuid::new_v4().to_string(),
21        children: vec![],
22    })
23}
24
25pub fn new_stmt_with_children(children: Vec<AST>) -> AST {
26    AST::Stmt(InnerNode {
27        id: Uuid::new_v4().to_string(),
28        children,
29    })
30}
31
32pub fn new_expr() -> AST {
33    AST::Expr(InnerNode {
34        id: Uuid::new_v4().to_string(),
35        children: vec![],
36    })
37}
38
39pub fn new_expr_with_children(children: Vec<AST>) -> AST {
40    AST::Expr(InnerNode {
41        id: Uuid::new_v4().to_string(),
42        children,
43    })
44}
45
46pub fn new_angle() -> AST {
47    AST::Angle(InnerNode {
48        id: Uuid::new_v4().to_string(),
49        children: vec![],
50    })
51}
52
53pub fn new_angle_with_children(children: Vec<AST>) -> AST {
54    AST::Angle(InnerNode {
55        id: Uuid::new_v4().to_string(),
56        children,
57    })
58}
59
60pub fn new_curly() -> AST {
61    AST::Curly(InnerNode {
62        id: Uuid::new_v4().to_string(),
63        children: vec![],
64    })
65}
66
67pub fn new_curly_with_children(children: Vec<AST>) -> AST {
68    AST::Curly(InnerNode {
69        id: Uuid::new_v4().to_string(),
70        children,
71    })
72}
73
74pub fn new_square() -> AST {
75    AST::Square(InnerNode {
76        id: Uuid::new_v4().to_string(),
77        children: vec![],
78    })
79}
80
81pub fn new_square_with_children(children: Vec<AST>) -> AST {
82    AST::Square(InnerNode {
83        id: Uuid::new_v4().to_string(),
84        children,
85    })
86}
87
88pub fn new_ident(children: Vec<AST>) -> AST {
89    AST::Identifier(InnerNode {
90        id: Uuid::new_v4().to_string(),
91        children,
92    })
93}
94
95pub fn new_text(value: String) -> AST {
96    AST::Text(LeafNode {
97        id: Uuid::new_v4().to_string(),
98        value,
99    })
100}
101
102fn assert_inner_node_eq(node1: &InnerNode, node2: &InnerNode) {
103    assert_eq!(node1.children.len(), node2.children.len());
104    for i in 0..node1.children.len() {
105        assert_ast_eq(&node1.children[i], &node2.children[i]);
106    }
107}
108
109fn assert_leaf_node_eq(node1: &LeafNode, node2: &LeafNode) {
110    assert_eq!(node1.value, node2.value);
111}
112
113pub fn assert_ast_eq(node1: &AST, node2: &AST) {
114    match (node1, node2) {
115        (AST::Document(inner1), AST::Document(inner2)) => assert_inner_node_eq(inner1, inner2),
116        (AST::Stmt(inner1), AST::Stmt(inner2)) => assert_inner_node_eq(inner1, inner2),
117        (AST::Expr(inner1), AST::Expr(inner2)) => assert_inner_node_eq(inner1, inner2),
118        (AST::Angle(inner1), AST::Angle(inner2)) => assert_inner_node_eq(inner1, inner2),
119        (AST::Square(inner1), AST::Square(inner2)) => assert_inner_node_eq(inner1, inner2),
120        (AST::Curly(inner1), AST::Curly(inner2)) => assert_inner_node_eq(inner1, inner2),
121        (AST::Identifier(leaf1), AST::Identifier(leaf2)) => assert_inner_node_eq(leaf1, leaf2),
122        (AST::Text(leaf1), AST::Text(leaf2)) => assert_leaf_node_eq(leaf1, leaf2),
123        _ => panic!(
124            "Mismatched AST node types or unexpected AST node\nleft: {:?}\nright: {:?}",
125            node1, node2
126        ),
127    }
128}