codama_nodes/value_nodes/
map_value_node.rs

1use crate::MapEntryValueNode;
2use codama_nodes_derive::node;
3
4#[node]
5pub struct MapValueNode {
6    // Children.
7    pub entries: Vec<MapEntryValueNode>,
8}
9
10impl From<MapValueNode> for crate::Node {
11    fn from(val: MapValueNode) -> Self {
12        crate::Node::Value(val.into())
13    }
14}
15
16impl MapValueNode {
17    pub fn new(entries: Vec<MapEntryValueNode>) -> Self {
18        Self { entries }
19    }
20}
21
22impl From<Vec<MapEntryValueNode>> for MapValueNode {
23    fn from(items: Vec<MapEntryValueNode>) -> 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 = MapValueNode::new(vec![
36            MapEntryValueNode::new(StringValueNode::new("Alice"), NumberValueNode::new(180)),
37            MapEntryValueNode::new(StringValueNode::new("Bob"), NumberValueNode::new(125)),
38        ]);
39        assert_eq!(
40            node.entries,
41            vec![
42                MapEntryValueNode::new(
43                    ValueNode::String(StringValueNode::new("Alice")),
44                    ValueNode::Number(NumberValueNode::new(180))
45                ),
46                MapEntryValueNode::new(
47                    ValueNode::String(StringValueNode::new("Bob")),
48                    ValueNode::Number(NumberValueNode::new(125))
49                ),
50            ]
51        );
52    }
53
54    #[test]
55    fn from_vec() {
56        let node: MapValueNode = vec![MapEntryValueNode::new(
57            StringValueNode::new("answer"),
58            NumberValueNode::new(42),
59        )]
60        .into();
61        assert_eq!(
62            node.entries,
63            vec![MapEntryValueNode::new(
64                StringValueNode::new("answer"),
65                NumberValueNode::new(42),
66            )]
67        );
68    }
69
70    #[test]
71    fn to_json() {
72        let node = MapValueNode::new(vec![MapEntryValueNode::new(
73            StringValueNode::new("answer"),
74            NumberValueNode::new(42),
75        )]);
76        let json = serde_json::to_string(&node).unwrap();
77        assert_eq!(
78            json,
79            r#"{"kind":"mapValueNode","entries":[{"kind":"mapEntryValueNode","key":{"kind":"stringValueNode","string":"answer"},"value":{"kind":"numberValueNode","number":42}}]}"#
80        );
81    }
82
83    #[test]
84    fn from_json() {
85        let json = r#"{"kind":"mapValueNode","entries":[{"kind":"mapEntryValueNode","key":{"kind":"stringValueNode","string":"answer"},"value":{"kind":"numberValueNode","number":42}}]}"#;
86        let node: MapValueNode = serde_json::from_str(json).unwrap();
87        assert_eq!(
88            node,
89            MapValueNode::new(vec![MapEntryValueNode::new(
90                StringValueNode::new("answer"),
91                NumberValueNode::new(42u32),
92            )])
93        );
94    }
95}