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