codama_nodes/
defined_type_node.rs

1use crate::{CamelCaseString, Docs, TypeNode};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct DefinedTypeNode {
6    // Data.
7    pub name: CamelCaseString,
8    #[serde(default, skip_serializing_if = "crate::is_default")]
9    pub docs: Docs,
10
11    // Children.
12    pub r#type: TypeNode,
13}
14
15impl DefinedTypeNode {
16    pub fn new<T, U>(name: T, r#type: U) -> Self
17    where
18        T: Into<CamelCaseString>,
19        U: Into<TypeNode>,
20    {
21        Self {
22            name: name.into(),
23            docs: Docs::default(),
24            r#type: r#type.into(),
25        }
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32    use crate::{NumberTypeNode, U8};
33
34    #[test]
35    fn new() {
36        let node = DefinedTypeNode::new("myType", NumberTypeNode::le(U8));
37        assert_eq!(node.name, CamelCaseString::new("myType"));
38        assert_eq!(node.docs, Docs::default());
39        assert_eq!(node.r#type, TypeNode::Number(NumberTypeNode::le(U8)));
40    }
41
42    #[test]
43    fn direct_instantiation() {
44        let node = DefinedTypeNode {
45            name: "myType".into(),
46            docs: Docs::default(),
47            r#type: NumberTypeNode::le(U8).into(),
48        };
49        assert_eq!(node.name, CamelCaseString::new("myType"));
50        assert_eq!(node.docs, Docs::default());
51        assert_eq!(node.r#type, TypeNode::Number(NumberTypeNode::le(U8)));
52    }
53
54    #[test]
55    fn to_json() {
56        let node = DefinedTypeNode::new("myType", NumberTypeNode::le(U8));
57        let json = serde_json::to_string(&node).unwrap();
58        assert_eq!(
59            json,
60            r#"{"kind":"definedTypeNode","name":"myType","type":{"kind":"numberTypeNode","format":"u8","endian":"le"}}"#
61        );
62    }
63
64    #[test]
65    fn from_json() {
66        let json = r#"{"kind":"definedTypeNode","name":"myType","type":{"kind":"numberTypeNode","format":"u8","endian":"le"}}"#;
67        let node: DefinedTypeNode = serde_json::from_str(json).unwrap();
68        assert_eq!(node, DefinedTypeNode::new("myType", NumberTypeNode::le(U8)));
69    }
70}