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