codama_nodes/
root_node.rs1use 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}