arri_repr/
enum.rs

1use crate::{EnumTransformation, MetadataSchema, Serializable, serializer::Serializer};
2
3/// Represents a schema for enumerations in the Arri system.
4///
5/// This struct defines an enumeration schema, including the list of
6/// possible values, optional metadata, transformations, and nullability.
7#[derive(Debug, PartialEq, Eq, Default)]
8pub struct EnumSchema {
9    /// A list of possible values for the enumeration.
10    pub r#enum: Vec<String>,
11    /// Optional metadata associated with the enumeration schema.
12    pub metadata: Option<MetadataSchema>,
13    /// A list of transformations applicable to the enumeration.
14    pub transformations: Vec<EnumTransformation>,
15    /// Indicates whether the enumeration can be null.
16    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}