reactive_graph_graph/types/properties/
mutability.rs

1use core::fmt;
2use schemars::JsonSchema;
3use std::fmt::Display;
4use std::fmt::Formatter;
5
6use serde::Deserialize;
7use serde::Serialize;
8
9#[cfg(any(test, feature = "test"))]
10use rand_derive3::RandGen;
11
12/// The mutability of a property.
13#[derive(Clone, Debug, PartialEq, Eq, Hash, Copy, Serialize, Deserialize, JsonSchema)]
14#[serde(rename_all = "lowercase")]
15#[cfg_attr(any(test, feature = "test"), derive(RandGen))]
16pub enum Mutability {
17    /// The property is mutable.
18    Mutable,
19
20    /// The property is immutable.
21    Immutable,
22}
23
24impl Mutability {
25    pub fn mutable() -> Self {
26        Mutability::Mutable
27    }
28    pub fn immutable() -> Self {
29        Mutability::Immutable
30    }
31}
32
33impl From<&str> for Mutability {
34    fn from(value: &str) -> Self {
35        match value.to_lowercase().as_str() {
36            "mutable" => Self::Mutable,
37            "immutable" => Self::Immutable,
38            _ => Self::Mutable,
39        }
40    }
41}
42
43impl Display for Mutability {
44    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
45        write!(f, "{self:?}")
46    }
47}
48
49#[cfg(any(test, feature = "test"))]
50use default_test::DefaultTest;
51
52#[cfg(any(test, feature = "test"))]
53impl DefaultTest for Mutability {
54    fn default_test() -> Self {
55        Mutability::generate_random()
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use schemars::schema_for;
62
63    use crate::Mutability;
64    use reactive_graph_utils_test::r_string;
65
66    #[test]
67    fn mutability_should_be_created_using_static_method_call() {
68        assert_eq!(Mutability::Mutable, Mutability::mutable());
69        assert_eq!(Mutability::Immutable, Mutability::immutable());
70    }
71
72    #[test]
73    fn mutability_from_str() {
74        assert_eq!(Mutability::Mutable, Mutability::from("mutable"));
75        assert_eq!(Mutability::Mutable, Mutability::from("Mutable"));
76        assert_eq!(Mutability::Mutable, Mutability::from("MUTABLE"));
77
78        assert_eq!(Mutability::Immutable, Mutability::from("immutable"));
79        assert_eq!(Mutability::Immutable, Mutability::from("Immutable"));
80        assert_eq!(Mutability::Immutable, Mutability::from("IMMUTABLE"));
81
82        // Fallback to String
83        assert_eq!(Mutability::Mutable, Mutability::from(r_string().as_str()));
84    }
85
86    #[test]
87    fn mutability_display() {
88        assert_eq!("Mutable", format!("{}", Mutability::Mutable));
89        assert_eq!("Immutable", format!("{}", Mutability::Immutable));
90    }
91
92    #[test]
93    fn data_type_json_schema() {
94        let schema = schema_for!(Mutability);
95        println!("{}", serde_json::to_string_pretty(&schema).unwrap());
96    }
97}