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}