Skip to main content

cool_plugin/
plugin.rs

1//! 插件定义
2
3use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5use std::any::Any;
6use thiserror::Error;
7
8/// 插件错误
9#[derive(Error, Debug)]
10pub enum PluginError {
11    #[error("插件初始化失败: {0}")]
12    InitFailed(String),
13    #[error("插件未找到: {0}")]
14    NotFound(String),
15    #[error("插件已禁用: {0}")]
16    Disabled(String),
17    #[error("方法未找到: {0}")]
18    MethodNotFound(String),
19    #[error("参数错误: {0}")]
20    InvalidParams(String),
21    #[error("执行错误: {0}")]
22    ExecutionError(String),
23    #[error("其他错误: {0}")]
24    Other(#[from] anyhow::Error),
25}
26
27pub type PluginResult<T> = Result<T, PluginError>;
28
29/// 插件信息
30#[derive(Debug, Clone, Serialize, Deserialize, Default)]
31pub struct PluginInfo {
32    /// 插件名称
33    pub name: String,
34    /// 插件唯一标识
35    pub key: String,
36    /// 钩子类型
37    pub hook: String,
38    /// 版本
39    pub version: String,
40    /// 描述
41    pub description: String,
42    /// 作者
43    pub author: String,
44    /// Logo
45    pub logo: String,
46    /// README
47    pub readme: String,
48    /// 配置
49    pub config: serde_json::Value,
50}
51
52/// 插件状态
53#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
54pub enum PluginStatus {
55    /// 已安装
56    Installed,
57    /// 已启用
58    Enabled,
59    /// 已禁用
60    Disabled,
61    /// 错误
62    Error,
63}
64
65/// 插件 trait
66#[async_trait]
67pub trait Plugin: Send + Sync {
68    /// 获取插件信息
69    fn info(&self) -> PluginInfo;
70
71    /// 获取插件状态
72    fn status(&self) -> PluginStatus {
73        PluginStatus::Enabled
74    }
75
76    /// 插件初始化
77    async fn init(&mut self, _config: serde_json::Value) -> PluginResult<()> {
78        Ok(())
79    }
80
81    /// 插件就绪
82    async fn ready(&mut self) -> PluginResult<()> {
83        Ok(())
84    }
85
86    /// 插件销毁
87    async fn destroy(&mut self) -> PluginResult<()> {
88        Ok(())
89    }
90
91    /// 调用插件方法
92    async fn invoke(
93        &self,
94        method: &str,
95        _params: serde_json::Value,
96    ) -> PluginResult<serde_json::Value> {
97        Err(PluginError::MethodNotFound(method.to_string()))
98    }
99
100    /// 转换为 Any(用于类型转换)
101    fn as_any(&self) -> &dyn Any;
102    fn as_any_mut(&mut self) -> &mut dyn Any;
103}