Skip to main content

bios_sdk_invoke/
invoke_config.rs

1use crate::invoke_enumeration::InvokeModuleKind;
2use lazy_static::lazy_static;
3use serde::{Deserialize, Serialize};
4use std::sync::Mutex;
5use std::{collections::HashMap, fmt::Debug};
6use tardis::basic::dto::TardisContext;
7use tardis::basic::{error::TardisError, result::TardisResult};
8use tardis::TardisFunsInst;
9#[derive(Debug, Serialize, Deserialize, Clone)]
10#[serde(default)]
11pub struct InvokeConfig {
12    pub spi_app_id: String,
13    pub module_urls: HashMap<String, String>,
14}
15
16impl Default for InvokeConfig {
17    fn default() -> Self {
18        InvokeConfig {
19            spi_app_id: Default::default(),
20            module_urls: HashMap::from([
21                (InvokeModuleKind::Kv.to_string(), "http://127.0.0.1:8080/spi-kv".to_string()),
22                (InvokeModuleKind::Log.to_string(), "http://127.0.0.1:8080/spi-log".to_string()),
23                (InvokeModuleKind::Search.to_string(), "http://127.0.0.1:8080/spi-search".to_string()),
24                (InvokeModuleKind::Schedule.to_string(), "http://127.0.0.1:8080/schedule".to_string()),
25                (InvokeModuleKind::Iam.to_string(), "http://127.0.0.1:8080/iam".to_string()),
26                (InvokeModuleKind::Stats.to_string(), "http://127.0.0.1:8080/spi-stats".to_string()),
27                (InvokeModuleKind::Event.to_string(), "http://127.0.0.1:8080/event".to_string()),
28            ]),
29        }
30    }
31}
32
33lazy_static! {
34    static ref INVOKE_CONFIG: Mutex<HashMap<String, InvokeConfig>> = Mutex::new(HashMap::new());
35}
36
37pub struct InvokeConfigManager;
38
39impl InvokeConfigManager {
40    pub fn add(code: &str, config: InvokeConfig) -> TardisResult<()> {
41        let mut conf = INVOKE_CONFIG.lock().map_err(|e| TardisError::internal_error(&format!("{e:?}"), ""))?;
42        conf.insert(code.to_string(), config);
43        Ok(())
44    }
45
46    pub fn match_module_url(code: &str, module_url: &str) -> bool {
47        Self::get_config(code, |conf| conf.module_urls.iter().any(|(k, _v)| module_url.eq(k)))
48    }
49
50    pub fn get_config<F, T>(code: &str, fun: F) -> T
51    where
52        F: Fn(&InvokeConfig) -> T,
53    {
54        let conf = INVOKE_CONFIG.lock().unwrap_or_else(|e| panic!("invoke config lock error: {e:?}"));
55        let conf = conf.get(code).unwrap_or_else(|| panic!("not found rbum config code {code}"));
56        fun(conf)
57    }
58}
59
60pub trait InvokeConfigApi {
61    fn invoke_conf_spi_app_id(&self) -> String;
62    fn invoke_conf_module_url(&self) -> HashMap<String, String>;
63    fn invoke_conf_match_module_url(&self, module_url: &str) -> bool;
64    fn invoke_conf_inject_context(&self, context: &TardisContext) -> TardisContext;
65}
66
67impl InvokeConfigApi for TardisFunsInst {
68    fn invoke_conf_spi_app_id(&self) -> String {
69        InvokeConfigManager::get_config(self.module_code(), |conf| conf.spi_app_id.clone())
70    }
71
72    fn invoke_conf_module_url(&self) -> HashMap<String, String> {
73        InvokeConfigManager::get_config(self.module_code(), |conf| conf.module_urls.clone())
74    }
75
76    fn invoke_conf_match_module_url(&self, module_url: &str) -> bool {
77        InvokeConfigManager::match_module_url(self.module_code(), module_url)
78    }
79
80    fn invoke_conf_inject_context(&self, context: &TardisContext) -> TardisContext {
81        let mut ctx = context.clone();
82        ctx.ak = self.invoke_conf_spi_app_id();
83        ctx
84    }
85}