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, 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
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use crate::{
35        ConstantPdaSeedNode, NumberTypeNode, NumberValueNode, PublicKeyTypeNode,
36        VariablePdaSeedNode, U8,
37    };
38
39    #[test]
40    fn new() {
41        let node = PdaNode::new(
42            "associatedToken",
43            vec![
44                VariablePdaSeedNode::new("owner", PublicKeyTypeNode::new()).into(),
45                ConstantPdaSeedNode::new(NumberTypeNode::le(U8), NumberValueNode::new(42u8)).into(),
46                VariablePdaSeedNode::new("mint", PublicKeyTypeNode::new()).into(),
47            ],
48        );
49        assert_eq!(node.name, CamelCaseString::new("associatedToken"));
50        assert_eq!(node.docs, Docs::default());
51        assert_eq!(node.program_id, None);
52        assert_eq!(
53            node.seeds,
54            vec![
55                PdaSeedNode::Variable(VariablePdaSeedNode::new("owner", PublicKeyTypeNode::new())),
56                PdaSeedNode::Constant(ConstantPdaSeedNode::new(
57                    NumberTypeNode::le(U8),
58                    NumberValueNode::new(42u8)
59                )),
60                PdaSeedNode::Variable(VariablePdaSeedNode::new("mint", PublicKeyTypeNode::new())),
61            ]
62        );
63    }
64
65    #[test]
66    fn direct_instantiation() {
67        let node = PdaNode {
68            name: "myPda".into(),
69            docs: Docs::default(),
70            program_id: Some("1234..5678".into()),
71            seeds: vec![],
72        };
73        assert_eq!(node.name, CamelCaseString::new("myPda"));
74        assert_eq!(node.docs, Docs::default());
75        assert_eq!(node.program_id, Some("1234..5678".into()));
76        assert_eq!(node.seeds, vec![]);
77    }
78
79    #[test]
80    fn to_json() {
81        let node = PdaNode::new("myPda", vec![]);
82        let json = serde_json::to_string(&node).unwrap();
83        assert_eq!(json, r#"{"kind":"pdaNode","name":"myPda","seeds":[]}"#);
84    }
85
86    #[test]
87    fn from_json() {
88        let json = r#"{"kind":"pdaNode","name":"myPda","seeds":[]}"#;
89        let node: PdaNode = serde_json::from_str(json).unwrap();
90        assert_eq!(node, PdaNode::new("myPda", vec![]));
91    }
92}