bios_sdk_invoke/
invoke_config.rs1use 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}