archetect_core/config/
variable.rs

1#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
2pub struct VariableInfo {
3    #[serde(skip_serializing_if = "Option::is_none")]
4    value: Option<String>,
5    #[serde(skip_serializing_if = "Option::is_none")]
6    default: Option<String>,
7    #[serde(skip_serializing_if = "Option::is_none")]
8    prompt: Option<String>,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    required: Option<bool>,
11    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
12    variable_type: Option<VariableType>,
13}
14
15impl VariableInfo {
16    pub fn new() -> VariableInfoBuilder {
17        VariableInfoBuilder {
18            variable_info: VariableInfo {
19                value: None,
20                default: None,
21                prompt: None,
22                required: None,
23                variable_type: None,
24            },
25        }
26    }
27
28    pub fn with_default<D: Into<String>>(default: D) -> VariableInfoBuilder {
29        VariableInfoBuilder {
30            variable_info: VariableInfo {
31                value: None,
32                default: Some(default.into()),
33                prompt: None,
34                required: None,
35                variable_type: None,
36            },
37        }
38    }
39
40    pub fn with_value<V: Into<String>>(value: V) -> VariableInfoBuilder {
41        VariableInfoBuilder {
42            variable_info: VariableInfo {
43                value: Some(value.into()),
44                default: None,
45                prompt: None,
46                required: None,
47                variable_type: None,
48            },
49        }
50    }
51
52    pub fn with_prompt<P: Into<String>>(prompt: P) -> VariableInfoBuilder {
53        VariableInfoBuilder {
54            variable_info: VariableInfo {
55                prompt: Some(prompt.into()),
56                value: None,
57                default: None,
58                required: None,
59                variable_type: None,
60            },
61        }
62    }
63
64    pub fn prompt(&self) -> Option<&str> {
65        match &self.prompt {
66            Some(prompt) => Some(&prompt),
67            None => None,
68        }
69    }
70
71    pub fn value(&self) -> Option<&str> {
72        match &self.value {
73            Some(value) => Some(value.as_str()),
74            None => None,
75        }
76    }
77
78    pub fn default(&self) -> Option<&str> {
79        match &self.default {
80            Some(default) => Some(default.as_str()),
81            None => None,
82        }
83    }
84
85    pub fn variable_type(&self) -> VariableType {
86        self.variable_type.clone().unwrap_or(VariableType::String)
87    }
88
89    pub fn required(&self) -> bool {
90        self.required.unwrap_or(true)
91    }
92
93    pub fn has_derived_value(&self) -> bool {
94        self.value.is_some()
95    }
96}
97
98#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
99pub enum VariableType {
100    #[serde(rename = "string")]
101    String,
102    #[serde(rename = "int")]
103    Int,
104    #[serde(rename = "bool")]
105    Bool,
106    #[serde(rename = "enum")]
107    Enum(Vec<String>),
108    #[serde(rename = "array", alias = "list")]
109    Array,
110}
111
112pub struct VariableInfoBuilder {
113    variable_info: VariableInfo,
114}
115
116impl VariableInfoBuilder {
117    pub fn with_prompt<P: Into<String>>(mut self, prompt: P) -> VariableInfoBuilder {
118        self.variable_info.prompt = Some(prompt.into());
119        self
120    }
121
122    pub fn with_value<V: Into<String>>(mut self, value: V) -> VariableInfoBuilder {
123        self.variable_info.value = Some(value.into());
124        self
125    }
126
127    pub fn with_default<D: Into<String>>(mut self, default: D) -> VariableInfoBuilder {
128        self.variable_info.default = Some(default.into());
129        self
130    }
131
132    pub fn with_type(mut self, variable_type: VariableType) -> VariableInfoBuilder {
133        self.variable_info.variable_type = Some(variable_type);
134        self
135    }
136
137    pub fn build(self) -> VariableInfo {
138        self.variable_info
139    }
140}