1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//! 插件配置相关定义
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<()>;
}