Skip to main content

codama_nodes/value_nodes/
enum_value_node.rs

1use crate::{
2    CamelCaseString, DefinedTypeLinkNode, EnumValueNode, EnumValuePayload, StructValueNode,
3    TupleValueNode,
4};
5
6impl EnumValueNode {
7    pub fn new<T, U>(r#enum: T, variant: U, value: Option<EnumValuePayload>) -> Self
8    where
9        T: Into<DefinedTypeLinkNode>,
10        U: Into<CamelCaseString>,
11    {
12        Self {
13            variant: variant.into(),
14            r#enum: r#enum.into(),
15            value: Box::new(value),
16        }
17    }
18
19    pub fn empty<T, U>(r#enum: T, variant: U) -> Self
20    where
21        T: Into<DefinedTypeLinkNode>,
22        U: Into<CamelCaseString>,
23    {
24        Self {
25            variant: variant.into(),
26            r#enum: r#enum.into(),
27            value: Box::new(None),
28        }
29    }
30
31    pub fn fields<T, U, V>(r#enum: T, variant: U, value: V) -> Self
32    where
33        T: Into<DefinedTypeLinkNode>,
34        U: Into<CamelCaseString>,
35        V: Into<StructValueNode>,
36    {
37        Self {
38            variant: variant.into(),
39            r#enum: r#enum.into(),
40            value: Box::new(Some(EnumValuePayload::Struct(value.into()))),
41        }
42    }
43
44    pub fn tuple<T, U, V>(r#enum: T, variant: U, value: V) -> Self
45    where
46        T: Into<DefinedTypeLinkNode>,
47        U: Into<CamelCaseString>,
48        V: Into<TupleValueNode>,
49    {
50        Self {
51            variant: variant.into(),
52            r#enum: r#enum.into(),
53            value: Box::new(Some(EnumValuePayload::Tuple(value.into()))),
54        }
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61    use crate::{NumberValueNode, StringValueNode, StructFieldValueNode};
62
63    #[test]
64    fn new() {
65        let node = EnumValueNode::new("direction", "north", None);
66        assert_eq!(node.r#enum, DefinedTypeLinkNode::new("direction"));
67        assert_eq!(node.variant, CamelCaseString::from("north"));
68        assert_eq!(*node.value, None);
69    }
70
71    #[test]
72    fn empty() {
73        let node = EnumValueNode::empty("command", "exit");
74        assert_eq!(node.r#enum, DefinedTypeLinkNode::new("command"));
75        assert_eq!(node.variant, CamelCaseString::from("exit"));
76        assert_eq!(*node.value, None);
77    }
78
79    #[test]
80    fn fields() {
81        let node = EnumValueNode::fields(
82            "command",
83            "move",
84            vec![
85                StructFieldValueNode::new("x", NumberValueNode::new(10)),
86                StructFieldValueNode::new("y", NumberValueNode::new(20)),
87            ],
88        );
89        assert_eq!(node.r#enum, DefinedTypeLinkNode::new("command"));
90        assert_eq!(node.variant, CamelCaseString::from("move"));
91        assert_eq!(
92            *node.value,
93            Some(EnumValuePayload::Struct(StructValueNode::new(vec![
94                StructFieldValueNode::new("x", NumberValueNode::new(10)),
95                StructFieldValueNode::new("y", NumberValueNode::new(20)),
96            ])))
97        );
98    }
99
100    #[test]
101    fn tuple() {
102        let node = EnumValueNode::tuple(
103            "command",
104            "write",
105            vec![StringValueNode::new("Hello World").into()],
106        );
107        assert_eq!(node.r#enum, DefinedTypeLinkNode::new("command"));
108        assert_eq!(node.variant, CamelCaseString::from("write"));
109        assert_eq!(
110            *node.value,
111            Some(EnumValuePayload::Tuple(TupleValueNode::new(vec![
112                StringValueNode::new("Hello World").into()
113            ])))
114        );
115    }
116
117    #[test]
118    fn to_json() {
119        let node = EnumValueNode::empty("command", "exit");
120        let json = serde_json::to_string(&node).unwrap();
121        assert_eq!(
122            json,
123            r#"{"kind":"enumValueNode","variant":"exit","enum":{"kind":"definedTypeLinkNode","name":"command"}}"#
124        );
125    }
126
127    #[test]
128    fn from_json() {
129        let json = r#"{"kind":"enumValueNode","variant":"exit","enum":{"kind":"definedTypeLinkNode","name":"command"}}"#;
130        let node: EnumValueNode = serde_json::from_str(json).unwrap();
131        assert_eq!(node, EnumValueNode::empty("command", "exit"));
132    }
133}