Skip to main content

codama_nodes/
root_node.rs

1use crate::{ProgramNode, RootNode, CODAMA_VERSION};
2
3impl Default for RootNode {
4    fn default() -> Self {
5        Self {
6            standard: "codama".into(),
7            version: CODAMA_VERSION.into(),
8            program: Default::default(),
9            additional_programs: Default::default(),
10        }
11    }
12}
13
14impl RootNode {
15    pub fn new(program: ProgramNode) -> Self {
16        Self {
17            program,
18            ..Self::default()
19        }
20    }
21
22    pub fn add_program(mut self, program: ProgramNode) -> Self {
23        self.additional_programs.push(program);
24        self
25    }
26}
27
28impl From<ProgramNode> for RootNode {
29    fn from(program: ProgramNode) -> Self {
30        Self::new(program)
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37    use pretty_assertions::assert_eq;
38
39    #[test]
40    fn new() {
41        let node = RootNode::new(ProgramNode {
42            name: "myProgram".into(),
43            ..ProgramNode::default()
44        });
45        assert_eq!(
46            node.program,
47            ProgramNode {
48                name: "myProgram".into(),
49                ..ProgramNode::default()
50            }
51        );
52        assert_eq!(node.additional_programs, vec![]);
53    }
54
55    #[test]
56    fn from_program() {
57        let node: RootNode = ProgramNode {
58            name: "myProgram".into(),
59            ..ProgramNode::default()
60        }
61        .into();
62        assert_eq!(
63            node.program,
64            ProgramNode {
65                name: "myProgram".into(),
66                ..ProgramNode::default()
67            }
68        );
69        assert_eq!(node.additional_programs, vec![]);
70    }
71
72    #[test]
73    fn direct_instantiation() {
74        let node = RootNode {
75            standard: "codama".into(),
76            version: "1.6.0".into(),
77            program: ProgramNode::new("myProgram", "1111"),
78            additional_programs: vec![
79                ProgramNode::new("myProgramDependencyA", "2222"),
80                ProgramNode::new("myProgramDependencyB", "3333"),
81            ],
82        };
83        assert_eq!(node.program, ProgramNode::new("myProgram", "1111"));
84        assert_eq!(
85            node.additional_programs,
86            vec![
87                ProgramNode::new("myProgramDependencyA", "2222"),
88                ProgramNode::new("myProgramDependencyB", "3333"),
89            ]
90        );
91    }
92
93    #[test]
94    fn to_json() {
95        let node = RootNode::new(ProgramNode {
96            name: "myProgram".into(),
97            public_key: "1234..5678".into(),
98            version: "1.2.3".into(),
99            ..ProgramNode::default()
100        });
101        let json = serde_json::to_string(&node).unwrap();
102        assert_eq!(
103            json,
104            r#"{"kind":"rootNode","standard":"codama","version":"1.6.0","program":{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3","accounts":[],"instructions":[],"definedTypes":[],"pdas":[],"events":[],"errors":[],"constants":[]},"additionalPrograms":[]}"#
105        );
106    }
107
108    #[test]
109    fn from_json() {
110        let json = r#"{"kind":"rootNode","standard":"codama","version":"1.6.0","program":{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3","accounts":[],"instructions":[],"definedTypes":[],"pdas":[],"events":[],"errors":[],"constants":[]},"additionalPrograms":[]}"#;
111        let node: RootNode = serde_json::from_str(json).unwrap();
112        assert_eq!(
113            node,
114            RootNode::new(ProgramNode {
115                name: "myProgram".into(),
116                public_key: "1234..5678".into(),
117                version: "1.2.3".into(),
118                ..ProgramNode::default()
119            })
120        );
121    }
122}