Skip to main content

codama_nodes/contextual_value_nodes/
pda_seed_value_node.rs

1use crate::{CamelCaseString, PdaSeedValueNode, PdaSeedValueValue, ValueNode};
2
3impl PdaSeedValueNode {
4    pub fn new<T, U>(name: T, value: U) -> Self
5    where
6        T: Into<CamelCaseString>,
7        U: Into<PdaSeedValueValue>,
8    {
9        Self {
10            name: name.into(),
11            value: Box::new(value.into()),
12        }
13    }
14}
15
16/// Bridge from the broader `ValueNode` union into `PdaSeedValueValue`.
17/// `PdaSeedValueValue` is `accountValueNode | argumentValueNode | valueNode`
18/// (16 variants total) — every value-node leaf maps to its same-named
19/// `PdaSeedValueValue` variant.
20impl From<ValueNode> for PdaSeedValueValue {
21    fn from(value: ValueNode) -> Self {
22        match value {
23            ValueNode::Array(value) => Self::Array(value),
24            ValueNode::Boolean(value) => Self::Boolean(value),
25            ValueNode::Bytes(value) => Self::Bytes(value),
26            ValueNode::Constant(value) => Self::Constant(value),
27            ValueNode::Enum(value) => Self::Enum(value),
28            ValueNode::Map(value) => Self::Map(value),
29            ValueNode::None(value) => Self::None(value),
30            ValueNode::Number(value) => Self::Number(value),
31            ValueNode::PublicKey(value) => Self::PublicKey(value),
32            ValueNode::Set(value) => Self::Set(value),
33            ValueNode::Some(value) => Self::Some(value),
34            ValueNode::String(value) => Self::String(value),
35            ValueNode::Struct(value) => Self::Struct(value),
36            ValueNode::Tuple(value) => Self::Tuple(value),
37        }
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use crate::NumberValueNode;
45
46    #[test]
47    fn new() {
48        let node = PdaSeedValueNode::new("answer", NumberValueNode::new(42));
49        assert_eq!(node.name, CamelCaseString::from("answer"));
50        assert_eq!(
51            *node.value,
52            PdaSeedValueValue::Number(NumberValueNode::new(42))
53        );
54    }
55
56    #[test]
57    fn to_json() {
58        let node = PdaSeedValueNode::new("answer", NumberValueNode::new(42));
59        let json = serde_json::to_string(&node).unwrap();
60        assert_eq!(
61            json,
62            r#"{"kind":"pdaSeedValueNode","name":"answer","value":{"kind":"numberValueNode","number":42}}"#
63        );
64    }
65
66    #[test]
67    fn from_json() {
68        let json: &str = r#"{"kind":"pdaSeedValueNode","name":"answer","value":{"kind":"numberValueNode","number":42}}"#;
69        let node: PdaSeedValueNode = serde_json::from_str(json).unwrap();
70        assert_eq!(
71            node,
72            PdaSeedValueNode::new("answer", NumberValueNode::new(42u32))
73        );
74    }
75}