codama_nodes/
account_node.rs

1use crate::{
2    CamelCaseString, DiscriminatorNode, Docs, NestedTypeNode, PdaLinkNode, StructTypeNode,
3};
4use codama_nodes_derive::node;
5
6#[node]
7pub struct AccountNode {
8    // Data.
9    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    // Children.
16    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}