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.7.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        // Empty arrays are omitted on write (skip-when-empty convention).
103        assert_eq!(
104            json,
105            r#"{"kind":"rootNode","standard":"codama","version":"1.8.0","program":{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3"}}"#
106        );
107    }
108
109    #[test]
110    fn from_json() {
111        // Absent arrays default to empty on read (skip-when-empty convention).
112        let json = r#"{"kind":"rootNode","standard":"codama","version":"1.8.0","program":{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3"}}"#;
113        let node: RootNode = serde_json::from_str(json).unwrap();
114        assert_eq!(
115            node,
116            RootNode::new(ProgramNode {
117                name: "myProgram".into(),
118                public_key: "1234..5678".into(),
119                version: "1.2.3".into(),
120                ..ProgramNode::default()
121            })
122        );
123    }
124}