1use crate::{EnumTransformation, MetadataSchema, Serializable, serializer::Serializer};
2
3#[derive(Debug, PartialEq, Eq, Default)]
8pub struct EnumSchema {
9 pub r#enum: Vec<String>,
11 pub metadata: Option<MetadataSchema>,
13 pub transformations: Vec<EnumTransformation>,
15 pub is_nullable: Option<bool>,
17}
18
19impl EnumSchema {
20 pub fn new() -> Self {
21 Self::default()
22 }
23
24 pub fn add_variant(&mut self, variant: impl ToString) {
25 let transformed = self
26 .transformations
27 .iter()
28 .fold(variant.to_string(), |acc, transform| transform.apply(&acc));
29
30 self.r#enum.push(transformed);
31 }
32
33 pub fn set_transforms(&mut self, transformations: &[EnumTransformation]) {
34 self.transformations = transformations.into();
35 }
36}
37
38impl Serializable for EnumSchema {
39 fn serialize(&self) -> Option<String> {
40 Serializer::builder()
41 .set("enum", &self.r#enum)
42 .set("metadata", &self.metadata)
43 .set("isNullable", &self.is_nullable)
44 .build()
45 .into()
46 }
47
48 fn set_metadata(&mut self, metadata: MetadataSchema) {
49 self.metadata = Some(metadata);
50 }
51
52 fn set_nullable(&mut self, is_nullable: bool) {
53 self.is_nullable = Some(is_nullable);
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_enum_serialize() {
63 let mut enum_schema = EnumSchema::new();
64 enum_schema.add_variant("Variant1");
65 enum_schema.add_variant("Variant2");
66 let serialized: serde_json::Value =
67 serde_json::from_str(&enum_schema.serialize().unwrap()).unwrap();
68
69 assert_eq!(
70 serialized,
71 serde_json::json!({ "enum": ["Variant1", "Variant2"] })
72 );
73 }
74
75 #[test]
76 fn test_add_variant() {
77 let mut enum_schema = EnumSchema::new();
78 enum_schema.add_variant("Variant1".to_string());
79 enum_schema.add_variant("Variant2".to_string());
80
81 assert_eq!(
82 enum_schema.r#enum,
83 vec!["Variant1".to_string(), "Variant2".to_string()]
84 );
85 }
86
87 #[test]
88 fn test_set_metadata() {
89 let mut enum_schema = EnumSchema::new();
90 enum_schema.add_variant("Variant1".to_string());
91 let metadata = MetadataSchema::default();
92 enum_schema.set_metadata(metadata.clone());
93
94 assert_eq!(enum_schema.metadata, Some(metadata));
95 }
96
97 #[test]
98 fn test_serialize_with_metadata() {
99 let mut enum_schema = EnumSchema::new();
100 enum_schema.add_variant("Variant1".to_string());
101 let metadata = MetadataSchema::default();
102 enum_schema.set_metadata(metadata);
103
104 let serialized: serde_json::Value =
105 serde_json::from_str(&enum_schema.serialize().unwrap()).unwrap();
106
107 assert!(serialized.get("metadata").is_some());
108 }
109}