fusion_core/
run_mode.rs

1use serde::{
2  Deserialize, Deserializer, Serialize,
3  de::{Unexpected, Visitor},
4};
5use strum::AsRefStr;
6
7#[derive(Debug, Clone, PartialEq, Serialize, AsRefStr)]
8pub enum RunMode {
9  DEV,
10  TEST,
11  DEMO,
12  PROD,
13}
14
15impl RunMode {
16  pub fn is_dev(&self) -> bool {
17    self == &RunMode::DEV
18  }
19
20  pub fn is_test(&self) -> bool {
21    self == &RunMode::TEST
22  }
23
24  pub fn is_demo(&self) -> bool {
25    self == &RunMode::DEMO
26  }
27
28  pub fn is_prod(&self) -> bool {
29    self == &RunMode::PROD
30  }
31}
32
33impl<'de> Deserialize<'de> for RunMode {
34  fn deserialize<D>(deserializer: D) -> core::result::Result<Self, D::Error>
35  where
36    D: Deserializer<'de>,
37  {
38    static MSG: &str = "expect in ('DEV', 'TEST', 'DEMO', 'PROD').";
39
40    struct StrToRunMode;
41
42    impl Visitor<'_> for StrToRunMode {
43      type Value = RunMode;
44
45      fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
46        formatter.write_str(MSG)
47      }
48
49      fn visit_str<E>(self, v: &str) -> core::result::Result<Self::Value, E>
50      where
51        E: serde::de::Error,
52      {
53        if v.eq_ignore_ascii_case(RunMode::DEV.as_ref()) {
54          Ok(RunMode::DEV)
55        } else if v.eq_ignore_ascii_case(RunMode::TEST.as_ref()) {
56          Ok(RunMode::TEST)
57        } else if v.eq_ignore_ascii_case(RunMode::DEMO.as_ref()) {
58          Ok(RunMode::DEMO)
59        } else if v.eq_ignore_ascii_case(RunMode::PROD.as_ref()) {
60          Ok(RunMode::PROD)
61        } else {
62          Err(serde::de::Error::invalid_value(Unexpected::Str(v), &MSG))
63        }
64      }
65    }
66    deserializer.deserialize_str(StrToRunMode)
67  }
68}