codama_nodes/contextual_value_nodes/
pda_value_node.rs1use crate::{PdaLinkNode, PdaNode, PdaSeedValueNode};
2use codama_nodes_derive::{node, node_union};
3
4#[node]
5pub struct PdaValueNode {
6 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}