codama_nodes/contextual_value_nodes/
pda_value_node.rs

1use crate::{PdaLinkNode, PdaNode, PdaSeedValueNode};
2use codama_nodes_derive::{node, node_union};
3
4#[node]
5pub struct PdaValueNode {
6    // Children.
7    pub pda: PdaValue,
8    pub seeds: Vec<PdaSeedValueNode>,
9}
10
11impl From<PdaValueNode> for crate::Node {
12    fn from(val: PdaValueNode) -> Self {
13        crate::Node::ContextualValue(val.into())
14    }
15}
16
17impl PdaValueNode {
18    pub fn new<T>(pda: T, seeds: Vec<PdaSeedValueNode>) -> Self
19    where
20        T: Into<PdaValue>,
21    {
22        Self {
23            pda: pda.into(),
24            seeds,
25        }
26    }
27}
28
29#[node_union]
30pub enum PdaValue {
31    Linked(PdaLinkNode),
32    Nested(PdaNode),
33}
34
35#[cfg(test)]
36mod tests {
37    use crate::{NumberTypeNode, NumberValueNode, PublicKeyValueNode, VariablePdaSeedNode, U32};
38
39    use super::*;
40
41    #[test]
42    fn new_linked() {
43        let node = PdaValueNode::new(
44            PdaLinkNode::new("masterEdition"),
45            vec![
46                PdaSeedValueNode::new(
47                    "mint",
48                    PublicKeyValueNode::new("33QJ9VtGKRS7wstQiwuigk1cBVYEPp3XBCC1g9WkDFEE"),
49                ),
50                PdaSeedValueNode::new("edition", NumberValueNode::new(42)),
51            ],
52        );
53        assert_eq!(
54            node.pda,
55            PdaValue::Linked(PdaLinkNode::new("masterEdition"))
56        );
57        assert_eq!(
58            node.seeds,
59            vec![
60                PdaSeedValueNode::new(
61                    "mint",
62                    PublicKeyValueNode::new("33QJ9VtGKRS7wstQiwuigk1cBVYEPp3XBCC1g9WkDFEE")
63                ),
64                PdaSeedValueNode::new("edition", NumberValueNode::new(42)),
65            ]
66        );
67    }
68
69    #[test]
70    fn new_nested() {
71        let node = PdaValueNode::new(
72            PdaNode::new(
73                "counter",
74                vec![VariablePdaSeedNode::new("value", NumberTypeNode::le(U32)).into()],
75            ),
76            vec![PdaSeedValueNode::new("value", NumberValueNode::new(42))],
77        );
78        assert_eq!(
79            node.pda,
80            PdaValue::Nested(PdaNode::new(
81                "counter",
82                vec![VariablePdaSeedNode::new("value", NumberTypeNode::le(U32)).into()],
83            ))
84        );
85        assert_eq!(
86            node.seeds,
87            vec![PdaSeedValueNode::new("value", NumberValueNode::new(42)),]
88        );
89    }
90
91    #[test]
92    fn to_json() {
93        let node = PdaValueNode::new(PdaLinkNode::new("myPda"), vec![]);
94        let json = serde_json::to_string(&node).unwrap();
95        assert_eq!(
96            json,
97            r#"{"kind":"pdaValueNode","pda":{"kind":"pdaLinkNode","name":"myPda"},"seeds":[]}"#
98        );
99    }
100
101    #[test]
102    fn from_json() {
103        let json: &str =
104            r#"{"kind":"pdaValueNode","pda":{"kind":"pdaLinkNode","name":"myPda"},"seeds":[]}"#;
105        let node: PdaValueNode = serde_json::from_str(json).unwrap();
106        assert_eq!(node, PdaValueNode::new(PdaLinkNode::new("myPda"), vec![]));
107    }
108}