codama_nodes/
program_node.rs1use crate::{
2 AccountNode, CamelCaseString, ConstantNode, DefinedTypeNode, ErrorNode, EventNode,
3 InstructionNode, PdaNode, ProgramNode,
4};
5
6impl ProgramNode {
7 pub fn new<T: Into<CamelCaseString>, U: Into<String>>(name: T, public_key: U) -> Self {
8 Self {
9 name: name.into(),
10 public_key: public_key.into(),
11 version: "0.0.0".into(),
12 ..Default::default()
13 }
14 }
15
16 pub fn set_version<T: Into<String>>(mut self, version: T) -> Self {
17 self.version = version.into();
18 self
19 }
20
21 pub fn add_account(mut self, account: AccountNode) -> Self {
22 self.accounts.push(account);
23 self
24 }
25
26 pub fn add_instruction(mut self, instruction: InstructionNode) -> Self {
27 self.instructions.push(instruction);
28 self
29 }
30
31 pub fn add_defined_type(mut self, defined_type: DefinedTypeNode) -> Self {
32 self.defined_types.push(defined_type);
33 self
34 }
35
36 pub fn add_pda(mut self, pda: PdaNode) -> Self {
37 self.pdas.push(pda);
38 self
39 }
40
41 pub fn add_event(mut self, event: EventNode) -> Self {
42 self.events.push(event);
43 self
44 }
45
46 pub fn add_error(mut self, error: ErrorNode) -> Self {
47 self.errors.push(error);
48 self
49 }
50
51 pub fn add_constant(mut self, constant: ConstantNode) -> Self {
52 self.constants.push(constant);
53 self
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60 use crate::Docs;
61 use pretty_assertions::assert_eq;
62
63 #[test]
64 fn new() {
65 let node = ProgramNode::new("my_program", "1234..5678");
66 assert_eq!(node.name, CamelCaseString::new("myProgram"));
67 assert_eq!(node.public_key, "1234..5678".to_string());
68 assert_eq!(node.version, "0.0.0".to_string());
69 assert_eq!(node.origin, None);
70 assert_eq!(node.docs, Docs::default());
71 assert_eq!(node.accounts, vec![]);
72 assert_eq!(node.instructions, vec![]);
73 assert_eq!(node.defined_types, vec![]);
74 assert_eq!(node.pdas, vec![]);
75 assert_eq!(node.events, vec![]);
76 assert_eq!(node.errors, vec![]);
77 assert_eq!(node.constants, vec![]);
78 }
79
80 #[test]
81 fn default_program() {
82 let node = ProgramNode::default();
83 assert_eq!(node.name, CamelCaseString::new(""));
84 assert_eq!(node.public_key, "".to_string());
85 assert_eq!(node.version, "".to_string());
86 assert_eq!(node.origin, None);
87 assert_eq!(node.docs, Docs::default());
88 assert_eq!(node.accounts, vec![]);
89 assert_eq!(node.instructions, vec![]);
90 assert_eq!(node.defined_types, vec![]);
91 assert_eq!(node.pdas, vec![]);
92 assert_eq!(node.events, vec![]);
93 assert_eq!(node.errors, vec![]);
94 assert_eq!(node.constants, vec![]);
95 }
96
97 #[test]
98 fn direct_instantiation() {
99 let node = ProgramNode {
100 name: "myProgram".into(),
101 public_key: "1234..5678".into(),
102 version: "1.2.3".into(),
103 ..ProgramNode::default()
104 };
105 assert_eq!(node.name, CamelCaseString::new("myProgram"));
106 assert_eq!(node.public_key, "1234..5678".to_string());
107 assert_eq!(node.version, "1.2.3".to_string());
108 assert_eq!(node.origin, None);
109 assert_eq!(node.docs, Docs::default());
110 assert_eq!(node.accounts, vec![]);
111 assert_eq!(node.instructions, vec![]);
112 assert_eq!(node.defined_types, vec![]);
113 assert_eq!(node.pdas, vec![]);
114 assert_eq!(node.events, vec![]);
115 assert_eq!(node.errors, vec![]);
116 assert_eq!(node.constants, vec![]);
117 }
118
119 #[test]
120 fn to_json() {
121 let node = ProgramNode {
122 name: "myProgram".into(),
123 public_key: "1234..5678".into(),
124 version: "1.2.3".into(),
125 ..ProgramNode::default()
126 };
127 let json = serde_json::to_string(&node).unwrap();
128 assert_eq!(
130 json,
131 r#"{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3"}"#
132 );
133 }
134
135 #[test]
136 fn from_json() {
137 let json = r#"{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3"}"#;
139 let node: ProgramNode = serde_json::from_str(json).unwrap();
140 assert_eq!(
141 node,
142 ProgramNode {
143 name: "myProgram".into(),
144 public_key: "1234..5678".into(),
145 version: "1.2.3".into(),
146 ..ProgramNode::default()
147 }
148 );
149 }
150}