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 = "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    // Children.
17    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}