codama_nodes/value_nodes/
tuple_value_node.rs

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