use crate::cacheable::CacheAble;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModuleConfig {
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,
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>, }
impl Default for ModuleConfig {
fn default() -> Self {
ModuleConfig {
account_config: serde_json::Value::Object(serde_json::Map::new()),
platform_config: serde_json::Value::Object(serde_json::Map::new()),
module_config: serde_json::Value::Object(serde_json::Map::new()),
data_middleware_config: HashMap::new(),
download_middleware_config: HashMap::new(),
rel_account_platform_config: serde_json::Value::Object(serde_json::Map::new()),
rel_module_account_config: serde_json::Value::Object(serde_json::Map::new()),
rel_module_platform_config: serde_json::Value::Object(serde_json::Map::new()),
rel_module_data_middleware_config: HashMap::new(),
rel_module_download_middleware_config: HashMap::new(),
}
}
}
impl ModuleConfig {
pub fn get_merged_config(&self) -> serde_json::Value {
let mut merged = serde_json::Map::new();
if let serde_json::Value::Object(account_config) = &self.account_config {
for (key, value) in account_config {
merged.insert(key.clone(), value.clone());
}
}
if let serde_json::Value::Object(platform_config) = &self.platform_config {
for (key, value) in platform_config {
merged.insert(key.clone(), value.clone());
}
}
for (_, config) in self.download_middleware_config.iter() {
if let serde_json::Value::Object(download_config) = config {
for (key, value) in download_config {
merged.insert(key.clone(), value.clone());
}
}
}
for (_, config) in self.data_middleware_config.iter() {
if let serde_json::Value::Object(data_config) = config {
for (key, value) in data_config {
merged.insert(key.clone(), value.clone());
}
}
}
if let serde_json::Value::Object(module_config) = &self.rel_account_platform_config {
for (key, value) in module_config {
merged.insert(key.clone(), value.clone());
}
}
for (_, config) in self.rel_module_download_middleware_config.iter() {
if let serde_json::Value::Object(rel_download_config) = config {
for (key, value) in rel_download_config {
merged.insert(key.clone(), value.clone());
}
}
}
for (_, config) in self.rel_module_data_middleware_config.iter() {
if let serde_json::Value::Object(rel_data_config) = config {
for (key, value) in rel_data_config {
merged.insert(key.clone(), value.clone());
}
}
}
if let serde_json::Value::Object(rel_account_config) = &self.rel_module_account_config {
for (key, value) in rel_account_config {
merged.insert(key.clone(), value.clone());
}
}
if let serde_json::Value::Object(rel_platform_config) = &self.rel_module_platform_config {
for (key, value) in rel_platform_config {
merged.insert(key.clone(), value.clone());
}
}
if let serde_json::Value::Object(module_config) = &self.module_config {
for (key, value) in module_config {
merged.insert(key.clone(), value.clone());
}
}
serde_json::Value::Object(merged)
}
pub fn get_config_value(&self, key: &str) -> Option<&serde_json::Value> {
if let serde_json::Value::Object(module_config) = &self.module_config
&& let Some(value) = module_config.get(key)
{
return Some(value);
}
if let serde_json::Value::Object(rel_platform_config) = &self.rel_module_platform_config
&& let Some(value) = rel_platform_config.get(key)
{
return Some(value);
}
if let serde_json::Value::Object(rel_account_config) = &self.rel_module_account_config
&& let Some(value) = rel_account_config.get(key)
{
return Some(value);
}
for (_, config) in self.rel_module_data_middleware_config.iter() {
if let serde_json::Value::Object(rel_data_config) = config
&& let Some(value) = rel_data_config.get(key)
{
return Some(value);
}
}
for (_, config) in self.rel_module_download_middleware_config.iter() {
if let serde_json::Value::Object(rel_download_config) = config
&& let Some(value) = rel_download_config.get(key)
{
return Some(value);
}
}
if let serde_json::Value::Object(rel_account_platform_config) =
&self.rel_account_platform_config
&& let Some(value) = rel_account_platform_config.get(key)
{
return Some(value);
}
if let serde_json::Value::Object(platform_config) = &self.platform_config
&& let Some(value) = platform_config.get(key)
{
return Some(value);
}
if let serde_json::Value::Object(account_config) = &self.account_config
&& let Some(value) = account_config.get(key)
{
return Some(value);
}
for (_, config) in self.download_middleware_config.iter() {
if let serde_json::Value::Object(data_config) = config
&& let Some(value) = data_config.get(key)
{
return Some(value);
}
}
for (_, config) in self.data_middleware_config.iter() {
if let serde_json::Value::Object(download_config) = config
&& let Some(value) = download_config.get(key)
{
return Some(value);
}
}
None
}
pub fn get_middleware_weight(&self, middleware_name: &str) -> Option<u32> {
if let Some(serde_json::Value::Object(obj)) =
self.download_middleware_config.get(middleware_name)
&& let Some(weight) = obj.get("weight")
{
return weight.as_u64().map(|v| v as u32);
}
if let Some(serde_json::Value::Object(obj)) = self
.rel_module_download_middleware_config
.get(middleware_name)
&& let Some(weight) = obj.get("weight")
{
return weight.as_u64().map(|v| v as u32);
}
None
}
pub fn get_task_config(&self, key: &str) -> Option<&serde_json::Value> {
if let serde_json::Value::Object(account_config) = &self.account_config
&& let Some(value) = account_config.get(key)
{
return Some(value);
}
if let serde_json::Value::Object(platform_config) = &self.platform_config
&& let Some(value) = platform_config.get(key)
{
return Some(value);
}
if let serde_json::Value::Object(rel_account_platform_config) =
&self.rel_account_platform_config
&& let Some(value) = rel_account_platform_config.get(key)
{
return Some(value);
}
None
}
pub fn get_config<T: serde::de::DeserializeOwned>(&self, key: &str) -> Option<T> {
if let Some(value) = self.get_config_value(key)
&& let Ok(config) = serde_json::from_value::<T>(value.clone())
{
return Some(config);
}
None
}
}
impl CacheAble for ModuleConfig {
fn field() -> impl AsRef<str> {
"module_config"
}
}