codama_nodes/
pda_node.rs

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