1use crate::{CamelCaseString, Docs, PdaSeedNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct PdaNode {
6 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 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}