Skip to main content

schema_model/model/
enum_type.rs

1#[derive(Debug, Clone)]
2pub struct EnumType {
3    name: String,
4    values: Vec<EnumValue>,
5}
6
7impl EnumType {
8    pub fn new<S: Into<String>>(name: S, values: Vec<EnumValue>) -> Self {
9        Self {
10            name: name.into(),
11            values,
12        }
13    }
14
15    pub fn name(&self) -> &str {
16        &self.name
17    }
18
19    pub fn values(&self) -> &Vec<EnumValue> {
20        &self.values
21    }
22}
23
24#[derive(Debug, Clone)]
25pub struct EnumValue {
26    name: String,
27    code: Option<String>,
28}
29
30impl EnumValue {
31    /// Create a new EnumValue. `code` may be None.
32    pub fn new<N: Into<String>, C: Into<String>>(name: N, code: Option<C>) -> Self {
33        Self {
34            name: name.into(),
35            code: code.map(|c| c.into()),
36        }
37    }
38
39    pub fn name(&self) -> &str {
40        &self.name
41    }
42
43    /// Returns the explicit code if present; otherwise falls back to the name
44    pub fn code(&self) -> &str {
45        self.code.as_deref().unwrap_or(&self.name)
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52
53    #[test]
54    fn enum_type_and_value_getters() {
55        let et = EnumType::new(
56            "Color",
57            vec![
58                EnumValue::new("RED", None::<String>),
59                EnumValue::new("GREEN", Some("G")),
60            ],
61        );
62        assert_eq!(et.name(), "Color");
63        assert_eq!(et.values().len(), 2);
64
65        let v1 = et.values()[0].clone();
66        assert_eq!(v1.name(), "RED");
67        // falls back to name
68        assert_eq!(v1.code(), "RED");
69
70        let v2 = et.values()[1].clone();
71        assert_eq!(v2.code(), "G");
72    }
73}