Skip to main content

codama_nodes/
program_node.rs

1use 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!(
129            json,
130            r#"{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3","accounts":[],"instructions":[],"definedTypes":[],"pdas":[],"events":[],"errors":[],"constants":[]}"#
131        );
132    }
133
134    #[test]
135    fn from_json() {
136        let json = r#"{"kind":"programNode","name":"myProgram","publicKey":"1234..5678","version":"1.2.3","accounts":[],"instructions":[],"definedTypes":[],"pdas":[],"events":[],"errors":[],"constants":[]}"#;
137        let node: ProgramNode = serde_json::from_str(json).unwrap();
138        assert_eq!(
139            node,
140            ProgramNode {
141                name: "myProgram".into(),
142                public_key: "1234..5678".into(),
143                version: "1.2.3".into(),
144                ..ProgramNode::default()
145            }
146        );
147    }
148}