Skip to main content

codama_nodes/
event_node.rs

1use crate::{CamelCaseString, DiscriminatorNode, Docs, HasName, TypeNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct EventNode {
6    // Data.
7    pub name: CamelCaseString,
8    #[serde(default, skip_serializing_if = "crate::is_default")]
9    pub docs: Docs,
10
11    // Children.
12    pub data: TypeNode,
13    #[serde(default, skip_serializing_if = "crate::is_default")]
14    pub discriminators: Vec<DiscriminatorNode>,
15}
16
17impl EventNode {
18    pub fn new<T, U>(name: T, data: U) -> Self
19    where
20        T: Into<CamelCaseString>,
21        U: Into<TypeNode>,
22    {
23        Self {
24            name: name.into(),
25            docs: Docs::default(),
26            data: data.into(),
27            discriminators: vec![],
28        }
29    }
30}
31
32impl HasName for EventNode {
33    fn name(&self) -> &CamelCaseString {
34        &self.name
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41    use crate::{NumberTypeNode, StringTypeNode, StructFieldTypeNode, StructTypeNode, U8};
42
43    #[test]
44    fn new() {
45        let node = EventNode::new(
46            "myEvent",
47            StructTypeNode::new(vec![
48                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
49                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
50            ]),
51        );
52
53        assert_eq!(node.name, CamelCaseString::new("myEvent"));
54        assert_eq!(node.docs, Docs::default());
55        assert_eq!(
56            node.data,
57            TypeNode::Struct(StructTypeNode::new(vec![
58                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
59                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
60            ]))
61        );
62        assert_eq!(node.discriminators, vec![]);
63    }
64
65    #[test]
66    fn direct_instantiation() {
67        let node = EventNode {
68            name: "myEvent".into(),
69            docs: Docs::default(),
70            data: StructTypeNode::new(vec![
71                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
72                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
73            ])
74            .into(),
75            discriminators: vec![],
76        };
77
78        assert_eq!(node.name, CamelCaseString::new("myEvent"));
79        assert_eq!(node.docs, Docs::default());
80        assert_eq!(
81            node.data,
82            TypeNode::Struct(StructTypeNode::new(vec![
83                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
84                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
85            ]))
86        );
87        assert_eq!(node.discriminators, vec![]);
88    }
89
90    #[test]
91    fn to_json() {
92        let node = EventNode::new(
93            "myEvent",
94            StructTypeNode::new(vec![
95                StructFieldTypeNode::new("name", StringTypeNode::utf8()),
96                StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
97            ]),
98        );
99
100        let json = serde_json::to_string(&node).unwrap();
101
102        assert_eq!(
103            json,
104            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"}}]}}"#
105        );
106    }
107
108    #[test]
109    fn from_json() {
110        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"}}]}}"#;
111
112        let node: EventNode = serde_json::from_str(json).unwrap();
113
114        assert_eq!(
115            node,
116            EventNode::new(
117                "myEvent",
118                StructTypeNode::new(vec![
119                    StructFieldTypeNode::new("name", StringTypeNode::utf8()),
120                    StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
121                ]),
122            )
123        );
124    }
125}