codama_nodes/
pda_node.rs

1use crate::{CamelCaseString, Docs, PdaSeedNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct PdaNode {
6    // Data.
7    pub name: CamelCaseString,
8    #[serde(default)]
9    #[serde(skip_serializing_if = "Docs::is_empty")]
10    pub docs: Docs,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub program_id: Option<String>,
13
14    // Children.
15    pub seeds: Vec<PdaSeedNode>,
16}
17
18impl PdaNode {
19    pub fn new<T>(name: T, seeds: Vec<PdaSeedNode>) -> Self
20    where
21        T: Into<CamelCaseString>,
22    {
23        Self {
24            name: name.into(),
25            docs: Docs::default(),
26            program_id: None,
27            seeds,
28        }
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35    use crate::{
36        ConstantPdaSeedNode, NumberTypeNode, NumberValueNode, PublicKeyTypeNode,
37        VariablePdaSeedNode, U8,
38    };
39
40    #[test]
41    fn new() {
42        let node = PdaNode::new(
43            "associatedToken",
44            vec![
45                VariablePdaSeedNode::new("owner", PublicKeyTypeNode::new()).into(),
46                ConstantPdaSeedNode::new(NumberTypeNode::le(U8), NumberValueNode::new(42u8)).into(),
47                VariablePdaSeedNode::new("mint", PublicKeyTypeNode::new()).into(),
48            ],
49        );
50        assert_eq!(node.name, CamelCaseString::new("associatedToken"));
51        assert_eq!(node.docs, Docs::default());
52        assert_eq!(node.program_id, None);
53        assert_eq!(
54            node.seeds,
55            vec![
56                PdaSeedNode::Variable(VariablePdaSeedNode::new("owner", PublicKeyTypeNode::new())),
57                PdaSeedNode::Constant(ConstantPdaSeedNode::new(
58                    NumberTypeNode::le(U8),
59                    NumberValueNode::new(42u8)
60                )),
61                PdaSeedNode::Variable(VariablePdaSeedNode::new("mint", PublicKeyTypeNode::new())),
62            ]
63        );
64    }
65
66    #[test]
67    fn direct_instantiation() {
68        let node = PdaNode {
69            name: "myPda".into(),
70            docs: Docs::default(),
71            program_id: Some("1234..5678".into()),
72            seeds: vec![],
73        };
74        assert_eq!(node.name, CamelCaseString::new("myPda"));
75        assert_eq!(node.docs, Docs::default());
76        assert_eq!(node.program_id, Some("1234..5678".into()));
77        assert_eq!(node.seeds, vec![]);
78    }
79
80    #[test]
81    fn to_json() {
82        let node = PdaNode::new("myPda", vec![]);
83        let json = serde_json::to_string(&node).unwrap();
84        assert_eq!(json, r#"{"kind":"pdaNode","name":"myPda","seeds":[]}"#);
85    }
86
87    #[test]
88    fn from_json() {
89        let json = r#"{"kind":"pdaNode","name":"myPda","seeds":[]}"#;
90        let node: PdaNode = serde_json::from_str(json).unwrap();
91        assert_eq!(node, PdaNode::new("myPda", vec![]));
92    }
93}