1use crate::{CamelCaseString, Docs, PdaSeedNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct PdaNode {
6 pub name: CamelCaseString,
8 #[serde(default)]
9 #[serde(skip_serializing_if = "Docs::is_empty")]
10 pub docs: Docs,
11 #[serde(skip_serializing_if = "Option::is_none")]
12 pub program_id: Option<String>,
13
14 pub seeds: Vec<PdaSeedNode>,
16}
17
18impl PdaNode {
19 pub fn new<T>(name: T, seeds: Vec<PdaSeedNode>) -> Self
20 where
21 T: Into<CamelCaseString>,
22 {
23 Self {
24 name: name.into(),
25 docs: Docs::default(),
26 program_id: None,
27 seeds,
28 }
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35 use crate::{
36 ConstantPdaSeedNode, NumberTypeNode, NumberValueNode, PublicKeyTypeNode,
37 VariablePdaSeedNode, U8,
38 };
39
40 #[test]
41 fn new() {
42 let node = PdaNode::new(
43 "associatedToken",
44 vec![
45 VariablePdaSeedNode::new("owner", PublicKeyTypeNode::new()).into(),
46 ConstantPdaSeedNode::new(NumberTypeNode::le(U8), NumberValueNode::new(42u8)).into(),
47 VariablePdaSeedNode::new("mint", PublicKeyTypeNode::new()).into(),
48 ],
49 );
50 assert_eq!(node.name, CamelCaseString::new("associatedToken"));
51 assert_eq!(node.docs, Docs::default());
52 assert_eq!(node.program_id, None);
53 assert_eq!(
54 node.seeds,
55 vec![
56 PdaSeedNode::Variable(VariablePdaSeedNode::new("owner", PublicKeyTypeNode::new())),
57 PdaSeedNode::Constant(ConstantPdaSeedNode::new(
58 NumberTypeNode::le(U8),
59 NumberValueNode::new(42u8)
60 )),
61 PdaSeedNode::Variable(VariablePdaSeedNode::new("mint", PublicKeyTypeNode::new())),
62 ]
63 );
64 }
65
66 #[test]
67 fn direct_instantiation() {
68 let node = PdaNode {
69 name: "myPda".into(),
70 docs: Docs::default(),
71 program_id: Some("1234..5678".into()),
72 seeds: vec![],
73 };
74 assert_eq!(node.name, CamelCaseString::new("myPda"));
75 assert_eq!(node.docs, Docs::default());
76 assert_eq!(node.program_id, Some("1234..5678".into()));
77 assert_eq!(node.seeds, vec![]);
78 }
79
80 #[test]
81 fn to_json() {
82 let node = PdaNode::new("myPda", vec![]);
83 let json = serde_json::to_string(&node).unwrap();
84 assert_eq!(json, r#"{"kind":"pdaNode","name":"myPda","seeds":[]}"#);
85 }
86
87 #[test]
88 fn from_json() {
89 let json = r#"{"kind":"pdaNode","name":"myPda","seeds":[]}"#;
90 let node: PdaNode = serde_json::from_str(json).unwrap();
91 assert_eq!(node, PdaNode::new("myPda", vec![]));
92 }
93}