mini_chat/infra/plugins/static_audit/
gear.rs1use std::sync::{Arc, OnceLock};
2
3use async_trait::async_trait;
4use toolkit::Gear;
5use toolkit::client_hub::ClientScope;
6use toolkit::context::GearCtx;
7use toolkit::gts::PluginV1;
8use tracing::info;
9use types_registry_sdk::{RegisterResult, TypesRegistryClient};
10
11use mini_chat_sdk::{MiniChatAuditPluginClientV1, MiniChatAuditPluginSpecV1};
12
13use super::config::StaticMiniChatAuditPluginConfig;
14use super::service::Service;
15
16#[toolkit::gear(
22 name = "static-mini-chat-audit-plugin",
23 deps = [types_registry]
24)]
25pub struct StaticMiniChatAuditPlugin {
26 service: OnceLock<Arc<Service>>,
27}
28
29impl Default for StaticMiniChatAuditPlugin {
30 fn default() -> Self {
31 Self {
32 service: OnceLock::new(),
33 }
34 }
35}
36
37#[async_trait]
38impl Gear for StaticMiniChatAuditPlugin {
39 async fn init(&self, ctx: &GearCtx) -> anyhow::Result<()> {
40 let cfg: StaticMiniChatAuditPluginConfig = ctx.config_or_default()?;
41 info!(
42 enabled = cfg.enabled,
43 vendor = %cfg.vendor,
44 priority = cfg.priority,
45 "Loaded static mini-chat audit plugin configuration"
46 );
47
48 let service = Arc::new(Service {
49 enabled: cfg.enabled,
50 });
51 self.service
52 .set(service.clone())
53 .map_err(|_| anyhow::anyhow!("{} gear already initialized", Self::MODULE_NAME))?;
54
55 let (instance_id, instance_json) =
57 PluginV1::<MiniChatAuditPluginSpecV1>::build_registration(
58 "cf.core._.static_mini_chat_audit.v1",
59 &cfg.vendor,
60 cfg.priority,
61 )?;
62
63 let registry = ctx.client_hub().get::<dyn TypesRegistryClient>()?;
65 let results = registry.register(vec![instance_json]).await?;
66 RegisterResult::ensure_all_ok(&results)?;
67
68 let api: Arc<dyn MiniChatAuditPluginClientV1> = service;
69 ctx.client_hub()
70 .register_scoped::<dyn MiniChatAuditPluginClientV1>(
71 ClientScope::gts_id(&instance_id),
72 api,
73 );
74
75 info!(instance_id = %instance_id, "Static mini-chat audit plugin registered");
76 Ok(())
77 }
78}