reactive_graph_graph/types/properties/
mutability.rs1use 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#[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 Mutable,
19
20 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 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}