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