codama_nodes/
root_node.rs1use crate::ProgramNode;
2use codama_nodes_derive::node;
3
4#[node]
5pub struct RootNode {
6 standard: String,
8 pub version: String,
9
10 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(), 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}