secra_plugins 0.1.32

生产级插件系统 - 插件的生命周期
Documentation
//! 插件配置相关定义

use super::error::PluginManagerResult;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

/// 插件配置
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PluginConfig {
    /// 是否启用插件
    pub enabled: bool,
    /// 配置参数(键值对)
    pub settings: HashMap<String, serde_json::Value>,
    /// 自定义配置数据
    #[serde(skip_serializing_if = "Option::is_none")]
    pub custom_config: Option<serde_json::Value>,
}

impl Default for PluginConfig {
    /// 创建默认的插件配置
    ///
    /// 返回一个启用状态为 `true`、空设置映射、无自定义配置的默认配置实例。
    ///
    /// # 返回值
    /// * `Self` - 默认配置实例
    ///
    /// # 默认值
    /// * `enabled`: `true` - 插件默认启用
    /// * `settings`: 空的 `HashMap` - 无配置参数
    /// * `custom_config`: `None` - 无自定义配置
    fn default() -> Self {
        Self {
            enabled: true,
            settings: HashMap::new(),
            custom_config: None,
        }
    }
}

/// 插件配置接口
///
/// 用于管理插件的配置信息
#[async_trait]
pub trait PluginConfiguration: Send + Sync {
    /// 获取插件配置
    ///
    /// 获取插件的完整配置信息,包括启用状态、设置参数和自定义配置。
    ///
    /// # 返回值
    /// * `PluginManagerResult<PluginConfig>` - 成功时返回插件的配置对象
    ///
    /// # 错误
    /// * `PluginManagerError::ConfigError` - 如果获取配置失败
    async fn get_config(&self) -> PluginManagerResult<PluginConfig>;

    /// 更新插件配置
    ///
    /// 使用新的配置对象更新插件的配置。更新后插件可能会根据新配置调整行为。
    ///
    /// # 参数
    /// * `config` - 新的插件配置对象
    ///
    /// # 返回值
    /// * `PluginManagerResult<()>` - 成功时返回 `Ok(())`
    ///
    /// # 错误
    /// * `PluginManagerError::ConfigError` - 如果配置更新失败或配置无效
    ///
    /// # 注意
    /// 更新配置后,插件可能需要重新初始化或重启才能应用新配置。
    async fn update_config(&mut self, config: PluginConfig) -> PluginManagerResult<()>;

    /// 验证配置是否有效
    ///
    /// 检查给定的配置对象是否符合插件的配置要求。
    /// 验证包括必填字段检查、值范围检查、格式检查等。
    ///
    /// # 参数
    /// * `config` - 要验证的配置对象
    ///
    /// # 返回值
    /// * `PluginManagerResult<bool>` - 配置有效返回 `Ok(true)`,无效返回 `Ok(false)`
    ///
    /// # 错误
    /// * `PluginManagerError::ConfigError` - 如果验证过程发生错误
    ///
    /// # 行为
    /// * 验证配置的完整性和有效性
    /// * 不修改配置对象,只进行只读检查
    async fn validate_config(&self, config: &PluginConfig) -> PluginManagerResult<bool>;

    /// 重置配置为默认值
    ///
    /// 将插件配置重置为默认值(`PluginConfig::default()`)。
    /// 这是一个便捷方法,内部调用 `update_config` 并传入默认配置。
    ///
    /// # 返回值
    /// * `PluginManagerResult<()>` - 成功时返回 `Ok(())`
    ///
    /// # 错误
    /// * `PluginManagerError::ConfigError` - 如果重置配置失败
    ///
    /// # 默认值
    /// * `enabled`: `true`
    /// * `settings`: 空的 `HashMap`
    /// * `custom_config`: `None`
    async fn reset_config(&mut self) -> PluginManagerResult<()> {
        self.update_config(PluginConfig::default()).await
    }

    /// 获取配置项
    ///
    /// 根据配置项的键名获取对应的配置值。
    ///
    /// # 参数
    /// * `key` - 配置项的键名
    ///
    /// # 返回值
    /// * `Option<serde_json::Value>` - 如果配置项存在返回 `Some(value)`,否则返回 `None`
    ///
    /// # 注意
    /// 此方法只从 `settings` 字段中查找配置项,不会查找 `custom_config` 中的值。
    fn get_setting(&self, key: &str) -> Option<serde_json::Value>;

    /// 设置配置项
    ///
    /// 设置或更新指定键名的配置项值。如果键已存在,则更新其值;如果不存在,则创建新的配置项。
    ///
    /// # 参数
    /// * `key` - 配置项的键名
    /// * `value` - 配置项的值(JSON 格式)
    ///
    /// # 返回值
    /// * `PluginManagerResult<()>` - 成功时返回 `Ok(())`
    ///
    /// # 错误
    /// * `PluginManagerError::ConfigError` - 如果设置配置项失败
    ///
    /// # 注意
    /// 此方法只更新 `settings` 字段,不会修改 `custom_config`。
    fn set_setting(&mut self, key: String, value: serde_json::Value) -> PluginManagerResult<()>;
}