Skip to main content

codama_nodes/
account_node.rs

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