codama_nodes/value_nodes/
map_value_node.rs1use crate::MapEntryValueNode;
2use codama_nodes_derive::node;
3
4#[node]
5pub struct MapValueNode {
6 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}