mocra_core/common/model/
model_config.rs1use crate::cacheable::CacheAble;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct ModuleConfig {
8 pub account_config: serde_json::Value, pub platform_config: serde_json::Value, pub module_config: serde_json::Value, pub data_middleware_config: HashMap<String, serde_json::Value>, pub download_middleware_config: HashMap<String, serde_json::Value>, pub rel_account_platform_config: serde_json::Value,
14 pub rel_module_account_config: serde_json::Value, pub rel_module_platform_config: serde_json::Value, pub rel_module_data_middleware_config: HashMap<String, serde_json::Value>, pub rel_module_download_middleware_config: HashMap<String, serde_json::Value>, }
19impl Default for ModuleConfig {
20 fn default() -> Self {
21 ModuleConfig {
22 account_config: serde_json::Value::Object(serde_json::Map::new()),
23 platform_config: serde_json::Value::Object(serde_json::Map::new()),
24 module_config: serde_json::Value::Object(serde_json::Map::new()),
25 data_middleware_config: HashMap::new(),
26 download_middleware_config: HashMap::new(),
27 rel_account_platform_config: serde_json::Value::Object(serde_json::Map::new()),
28 rel_module_account_config: serde_json::Value::Object(serde_json::Map::new()),
29 rel_module_platform_config: serde_json::Value::Object(serde_json::Map::new()),
30 rel_module_data_middleware_config: HashMap::new(),
31 rel_module_download_middleware_config: HashMap::new(),
32 }
33 }
34}
35impl ModuleConfig {
36 pub fn get_merged_config(&self) -> serde_json::Value {
40 let mut merged = serde_json::Map::new();
41
42 if let serde_json::Value::Object(account_config) = &self.account_config {
46 for (key, value) in account_config {
47 merged.insert(key.clone(), value.clone());
48 }
49 }
50
51 if let serde_json::Value::Object(platform_config) = &self.platform_config {
53 for (key, value) in platform_config {
54 merged.insert(key.clone(), value.clone());
55 }
56 }
57
58 for config in self.download_middleware_config.values() {
60 if let serde_json::Value::Object(download_config) = config {
61 for (key, value) in download_config {
62 merged.insert(key.clone(), value.clone());
63 }
64 }
65 }
66
67 for config in self.data_middleware_config.values() {
69 if let serde_json::Value::Object(data_config) = config {
70 for (key, value) in data_config {
71 merged.insert(key.clone(), value.clone());
72 }
73 }
74 }
75
76 if let serde_json::Value::Object(module_config) = &self.rel_account_platform_config {
77 for (key, value) in module_config {
78 merged.insert(key.clone(), value.clone());
79 }
80 }
81
82 for config in self.rel_module_download_middleware_config.values() {
84 if let serde_json::Value::Object(rel_download_config) = config {
85 for (key, value) in rel_download_config {
86 merged.insert(key.clone(), value.clone());
87 }
88 }
89 }
90
91 for config in self.rel_module_data_middleware_config.values() {
93 if let serde_json::Value::Object(rel_data_config) = config {
94 for (key, value) in rel_data_config {
95 merged.insert(key.clone(), value.clone());
96 }
97 }
98 }
99
100 if let serde_json::Value::Object(rel_account_config) = &self.rel_module_account_config {
102 for (key, value) in rel_account_config {
103 merged.insert(key.clone(), value.clone());
104 }
105 }
106
107 if let serde_json::Value::Object(rel_platform_config) = &self.rel_module_platform_config {
109 for (key, value) in rel_platform_config {
110 merged.insert(key.clone(), value.clone());
111 }
112 }
113
114 if let serde_json::Value::Object(module_config) = &self.module_config {
116 for (key, value) in module_config {
117 merged.insert(key.clone(), value.clone());
118 }
119 }
120
121 serde_json::Value::Object(merged)
122 }
123
124 pub fn get_config_value(&self, key: &str) -> Option<&serde_json::Value> {
126 if let serde_json::Value::Object(module_config) = &self.module_config
128 && let Some(value) = module_config.get(key)
129 {
130 return Some(value);
131 }
132
133 if let serde_json::Value::Object(rel_platform_config) = &self.rel_module_platform_config
135 && let Some(value) = rel_platform_config.get(key)
136 {
137 return Some(value);
138 }
139
140 if let serde_json::Value::Object(rel_account_config) = &self.rel_module_account_config
142 && let Some(value) = rel_account_config.get(key)
143 {
144 return Some(value);
145 }
146
147 for config in self.rel_module_data_middleware_config.values() {
149 if let serde_json::Value::Object(rel_data_config) = config
150 && let Some(value) = rel_data_config.get(key)
151 {
152 return Some(value);
153 }
154 }
155
156 for config in self.rel_module_download_middleware_config.values() {
158 if let serde_json::Value::Object(rel_download_config) = config
159 && let Some(value) = rel_download_config.get(key)
160 {
161 return Some(value);
162 }
163 }
164
165 if let serde_json::Value::Object(rel_account_platform_config) =
166 &self.rel_account_platform_config
167 && let Some(value) = rel_account_platform_config.get(key)
168 {
169 return Some(value);
170 }
171 if let serde_json::Value::Object(platform_config) = &self.platform_config
173 && let Some(value) = platform_config.get(key)
174 {
175 return Some(value);
176 }
177 if let serde_json::Value::Object(account_config) = &self.account_config
179 && let Some(value) = account_config.get(key)
180 {
181 return Some(value);
182 }
183 for config in self.download_middleware_config.values() {
185 if let serde_json::Value::Object(data_config) = config
186 && let Some(value) = data_config.get(key)
187 {
188 return Some(value);
189 }
190 }
191
192 for config in self.data_middleware_config.values() {
194 if let serde_json::Value::Object(download_config) = config
195 && let Some(value) = download_config.get(key)
196 {
197 return Some(value);
198 }
199 }
200 None
201 }
202 pub fn get_middleware_weight(&self, middleware_name: &str) -> Option<u32> {
203 if let Some(serde_json::Value::Object(obj)) =
204 self.download_middleware_config.get(middleware_name)
205 && let Some(weight) = obj.get("weight")
206 {
207 return weight.as_u64().map(|v| v as u32);
208 }
209 if let Some(serde_json::Value::Object(obj)) = self
210 .rel_module_download_middleware_config
211 .get(middleware_name)
212 && let Some(weight) = obj.get("weight")
213 {
214 return weight.as_u64().map(|v| v as u32);
215 }
216 None
217 }
218 pub fn get_task_config(&self, key: &str) -> Option<&serde_json::Value> {
219 if let serde_json::Value::Object(account_config) = &self.account_config
220 && let Some(value) = account_config.get(key)
221 {
222 return Some(value);
223 }
224 if let serde_json::Value::Object(platform_config) = &self.platform_config
225 && let Some(value) = platform_config.get(key)
226 {
227 return Some(value);
228 }
229 if let serde_json::Value::Object(rel_account_platform_config) =
230 &self.rel_account_platform_config
231 && let Some(value) = rel_account_platform_config.get(key)
232 {
233 return Some(value);
234 }
235 None
236 }
237
238 pub fn get_config<T: serde::de::DeserializeOwned>(&self, key: &str) -> Option<T> {
239 if let Some(value) = self.get_config_value(key)
240 && let Ok(config) = serde_json::from_value::<T>(value.clone())
241 {
242 return Some(config);
243 }
244 None
245 }
246}
247
248impl CacheAble for ModuleConfig {
249 fn field() -> impl AsRef<str> {
250 "module_config"
251 }
252}