1use crate::{CamelCaseString, Docs, HasName, 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
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}