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