codama_nodes/contextual_value_nodes/
pda_seed_value_node.rs

1use crate::{
2    AccountValueNode, ArgumentValueNode, ArrayValueNode, BooleanValueNode, BytesValueNode,
3    CamelCaseString, ConstantValueNode, EnumValueNode, HasName, MapValueNode, NoneValueNode,
4    NumberValueNode, PublicKeyValueNode, SetValueNode, SomeValueNode, StringValueNode,
5    StructValueNode, TupleValueNode, ValueNode,
6};
7use codama_nodes_derive::{node, node_union};
8
9#[node]
10pub struct PdaSeedValueNode {
11    // Data.
12    pub name: CamelCaseString,
13
14    // Children.
15    pub value: PdaSeedValueValueNode,
16}
17
18impl From<PdaSeedValueNode> for crate::Node {
19    fn from(val: PdaSeedValueNode) -> Self {
20        crate::Node::ContextualValue(val.into())
21    }
22}
23
24impl PdaSeedValueNode {
25    pub fn new<T, U>(name: T, value: U) -> Self
26    where
27        T: Into<CamelCaseString>,
28        U: Into<PdaSeedValueValueNode>,
29    {
30        Self {
31            name: name.into(),
32            value: value.into(),
33        }
34    }
35}
36
37impl HasName for PdaSeedValueNode {
38    fn name(&self) -> &CamelCaseString {
39        &self.name
40    }
41}
42
43#[node_union]
44pub enum PdaSeedValueValueNode {
45    Account(AccountValueNode),
46    Argument(ArgumentValueNode),
47
48    // ValueNodes.
49    Array(ArrayValueNode),
50    Boolean(BooleanValueNode),
51    Bytes(BytesValueNode),
52    Constant(ConstantValueNode),
53    Enum(EnumValueNode),
54    Map(MapValueNode),
55    None(NoneValueNode),
56    Number(NumberValueNode),
57    PublicKey(PublicKeyValueNode),
58    Set(SetValueNode),
59    Some(SomeValueNode),
60    String(StringValueNode),
61    Struct(StructValueNode),
62    Tuple(TupleValueNode),
63}
64
65impl From<ValueNode> for PdaSeedValueValueNode {
66    fn from(value: ValueNode) -> Self {
67        match value {
68            ValueNode::Array(value) => Self::Array(value),
69            ValueNode::Boolean(value) => Self::Boolean(value),
70            ValueNode::Bytes(value) => Self::Bytes(value),
71            ValueNode::Constant(value) => Self::Constant(value),
72            ValueNode::Enum(value) => Self::Enum(value),
73            ValueNode::Map(value) => Self::Map(value),
74            ValueNode::None(value) => Self::None(value),
75            ValueNode::Number(value) => Self::Number(value),
76            ValueNode::PublicKey(value) => Self::PublicKey(value),
77            ValueNode::Set(value) => Self::Set(value),
78            ValueNode::Some(value) => Self::Some(value),
79            ValueNode::String(value) => Self::String(value),
80            ValueNode::Struct(value) => Self::Struct(value),
81            ValueNode::Tuple(value) => Self::Tuple(value),
82        }
83    }
84}
85
86#[cfg(test)]
87mod tests {
88    use crate::NumberValueNode;
89
90    use super::*;
91
92    #[test]
93    fn new() {
94        let node = PdaSeedValueNode::new("answer", NumberValueNode::new(42));
95        assert_eq!(node.name, CamelCaseString::from("answer"));
96        assert_eq!(
97            node.value,
98            PdaSeedValueValueNode::Number(NumberValueNode::new(42))
99        );
100    }
101
102    #[test]
103    fn to_json() {
104        let node = PdaSeedValueNode::new("answer", NumberValueNode::new(42));
105        let json = serde_json::to_string(&node).unwrap();
106        assert_eq!(
107            json,
108            r#"{"kind":"pdaSeedValueNode","name":"answer","value":{"kind":"numberValueNode","number":42}}"#
109        );
110    }
111
112    #[test]
113    fn from_json() {
114        let json: &str = r#"{"kind":"pdaSeedValueNode","name":"answer","value":{"kind":"numberValueNode","number":42}}"#;
115        let node: PdaSeedValueNode = serde_json::from_str(json).unwrap();
116        assert_eq!(
117            node,
118            PdaSeedValueNode::new("answer", NumberValueNode::new(42u32))
119        );
120    }
121}