Skip to main content

codama_nodes/
event_node.rs

1use crate::{CamelCaseString, Docs, EventNode, TypeNode};
2
3impl EventNode {
4    pub fn new<T, U>(name: T, data: U) -> Self
5    where
6        T: Into<CamelCaseString>,
7        U: Into<TypeNode>,
8    {
9        Self {
10            name: name.into(),
11            docs: Docs::default(),
12            data: Box::new(data.into()),
13            discriminators: vec![],
14        }
15    }
16}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21    use crate::{NumberTypeNode, StringTypeNode, StructFieldTypeNode, StructTypeNode, U8};
22
23    #[test]
24    fn new() {
25        let node = EventNode::new(
26            "myEvent",
27            StructTypeNode::new(vec![
28                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
29                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
30            ]),
31        );
32
33        assert_eq!(node.name, CamelCaseString::new("myEvent"));
34        assert_eq!(node.docs, Docs::default());
35        assert_eq!(
36            *node.data,
37            TypeNode::Struct(StructTypeNode::new(vec![
38                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
39                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
40            ]))
41        );
42        assert_eq!(node.discriminators, vec![]);
43    }
44
45    #[test]
46    fn direct_instantiation() {
47        let node = EventNode {
48            name: "myEvent".into(),
49            docs: Docs::default(),
50            data: Box::new(
51                StructTypeNode::new(vec![
52                    StructFieldTypeNode::new("name", StringTypeNode::utf8()),
53                    StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
54                ])
55                .into(),
56            ),
57            discriminators: vec![],
58        };
59
60        assert_eq!(node.name, CamelCaseString::new("myEvent"));
61        assert_eq!(node.docs, Docs::default());
62        assert_eq!(
63            *node.data,
64            TypeNode::Struct(StructTypeNode::new(vec![
65                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
66                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
67            ]))
68        );
69        assert_eq!(node.discriminators, vec![]);
70    }
71
72    #[test]
73    fn to_json() {
74        let node = EventNode::new(
75            "myEvent",
76            StructTypeNode::new(vec![
77                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
78                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
79            ]),
80        );
81
82        let json = serde_json::to_string(&node).unwrap();
83
84        assert_eq!(
85            json,
86            r#"{"kind":"eventNode","name":"myEvent","data":{"kind":"structTypeNode","fields":[{"kind":"structFieldTypeNode","name":"name","type":{"kind":"stringTypeNode","encoding":"utf8"}},{"kind":"structFieldTypeNode","name":"age","type":{"kind":"numberTypeNode","format":"u8","endian":"le"}}]}}"#
87        );
88    }
89
90    #[test]
91    fn from_json() {
92        let json = r#"{"kind":"eventNode","name":"myEvent","data":{"kind":"structTypeNode","fields":[{"kind":"structFieldTypeNode","name":"name","type":{"kind":"stringTypeNode","encoding":"utf8"}},{"kind":"structFieldTypeNode","name":"age","type":{"kind":"numberTypeNode","format":"u8","endian":"le"}}]}}"#;
93
94        let node: EventNode = serde_json::from_str(json).unwrap();
95
96        assert_eq!(
97            node,
98            EventNode::new(
99                "myEvent",
100                StructTypeNode::new(vec![
101                    StructFieldTypeNode::new("name", StringTypeNode::utf8()),
102                    StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
103                ]),
104            )
105        );
106    }
107}