codama_nodes/value_nodes/
struct_field_value_node.rs

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