codama_nodes/value_nodes/
struct_value_node.rs

1use crate::StructFieldValueNode;
2use codama_nodes_derive::node;
3
4#[node]
5pub struct StructValueNode {
6    // Children.
7    pub fields: Vec<StructFieldValueNode>,
8}
9
10impl From<StructValueNode> for crate::Node {
11    fn from(val: StructValueNode) -> Self {
12        crate::Node::Value(val.into())
13    }
14}
15
16impl StructValueNode {
17    pub fn new(fields: Vec<StructFieldValueNode>) -> Self {
18        Self { fields }
19    }
20}
21
22impl From<Vec<StructFieldValueNode>> for StructValueNode {
23    fn from(items: Vec<StructFieldValueNode>) -> Self {
24        Self::new(items)
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31    use crate::{NumberValueNode, StringValueNode, ValueNode};
32
33    #[test]
34    fn new() {
35        let node = StructValueNode::new(vec![
36            StructFieldValueNode::new("name", StringValueNode::new("Alice")),
37            StructFieldValueNode::new("age", NumberValueNode::new(42)),
38        ]);
39        assert_eq!(
40            node.fields,
41            vec![
42                StructFieldValueNode::new("name", ValueNode::String(StringValueNode::new("Alice"))),
43                StructFieldValueNode::new("age", ValueNode::Number(NumberValueNode::new(42))),
44            ]
45        );
46    }
47
48    #[test]
49    fn from_vec() {
50        let node: StructValueNode = vec![
51            StructFieldValueNode::new("name", StringValueNode::new("Alice")),
52            StructFieldValueNode::new("age", NumberValueNode::new(42)),
53        ]
54        .into();
55        assert_eq!(
56            node.fields,
57            vec![
58                StructFieldValueNode::new("name", ValueNode::String(StringValueNode::new("Alice"))),
59                StructFieldValueNode::new("age", ValueNode::Number(NumberValueNode::new(42))),
60            ]
61        );
62    }
63
64    #[test]
65    fn to_json() {
66        let node = StructValueNode::new(vec![StructFieldValueNode::new(
67            "answer",
68            NumberValueNode::new(42),
69        )]);
70        let json = serde_json::to_string(&node).unwrap();
71        assert_eq!(
72            json,
73            r#"{"kind":"structValueNode","fields":[{"kind":"structFieldValueNode","name":"answer","value":{"kind":"numberValueNode","number":42}}]}"#
74        );
75    }
76
77    #[test]
78    fn from_json() {
79        let json = r#"{"kind":"structValueNode","fields":[{"kind":"structFieldValueNode","name":"answer","value":{"kind":"numberValueNode","number":42}}]}"#;
80        let node: StructValueNode = serde_json::from_str(json).unwrap();
81        assert_eq!(
82            node,
83            StructValueNode::new(vec![StructFieldValueNode::new(
84                "answer",
85                NumberValueNode::new(42u32),
86            )])
87        );
88    }
89}