codama_nodes/value_nodes/
enum_value_node.rs1use 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}