codama_nodes/value_nodes/
map_entry_value_node.rs

1use crate::ValueNode;
2use codama_nodes_derive::node;
3
4#[node]
5pub struct MapEntryValueNode {
6    // Children.
7    pub key: ValueNode,
8    pub value: ValueNode,
9}
10
11impl From<MapEntryValueNode> for crate::Node {
12    fn from(val: MapEntryValueNode) -> Self {
13        crate::Node::Value(val.into())
14    }
15}
16
17impl MapEntryValueNode {
18    pub fn new<T, U>(key: T, value: U) -> Self
19    where
20        T: Into<ValueNode>,
21        U: Into<ValueNode>,
22    {
23        Self {
24            key: key.into(),
25            value: value.into(),
26        }
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use crate::{NumberValueNode, StringValueNode};
33
34    use super::*;
35
36    #[test]
37    fn new() {
38        let node = MapEntryValueNode::new(StringValueNode::new("answer"), NumberValueNode::new(42));
39        assert_eq!(node.key, ValueNode::String(StringValueNode::new("answer")));
40        assert_eq!(node.value, ValueNode::Number(NumberValueNode::new(42)));
41    }
42
43    #[test]
44    fn to_json() {
45        let node = MapEntryValueNode::new(StringValueNode::new("answer"), NumberValueNode::new(42));
46        let json = serde_json::to_string(&node).unwrap();
47        assert_eq!(
48            json,
49            r#"{"kind":"mapEntryValueNode","key":{"kind":"stringValueNode","string":"answer"},"value":{"kind":"numberValueNode","number":42}}"#
50        );
51    }
52
53    #[test]
54    fn from_json() {
55        let json = r#"{"kind":"mapEntryValueNode","key":{"kind":"stringValueNode","string":"answer"},"value":{"kind":"numberValueNode","number":42}}"#;
56        let node: MapEntryValueNode = serde_json::from_str(json).unwrap();
57        assert_eq!(
58            node,
59            MapEntryValueNode::new(StringValueNode::new("answer"), NumberValueNode::new(42u32))
60        );
61    }
62}