codama_nodes/
root_node.rs

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