1use crate::{CamelCaseString, DiscriminatorNode, Docs, HasName, TypeNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct EventNode {
6 pub name: CamelCaseString,
8 #[serde(default, skip_serializing_if = "crate::is_default")]
9 pub docs: Docs,
10
11 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}