1use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5use std::any::Any;
6use thiserror::Error;
7
8#[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#[derive(Debug, Clone, Serialize, Deserialize, Default)]
31pub struct PluginInfo {
32 pub name: String,
34 pub key: String,
36 pub hook: String,
38 pub version: String,
40 pub description: String,
42 pub author: String,
44 pub logo: String,
46 pub readme: String,
48 pub config: serde_json::Value,
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
54pub enum PluginStatus {
55 Installed,
57 Enabled,
59 Disabled,
61 Error,
63}
64
65#[async_trait]
67pub trait Plugin: Send + Sync {
68 fn info(&self) -> PluginInfo;
70
71 fn status(&self) -> PluginStatus {
73 PluginStatus::Enabled
74 }
75
76 async fn init(&mut self, _config: serde_json::Value) -> PluginResult<()> {
78 Ok(())
79 }
80
81 async fn ready(&mut self) -> PluginResult<()> {
83 Ok(())
84 }
85
86 async fn destroy(&mut self) -> PluginResult<()> {
88 Ok(())
89 }
90
91 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 fn as_any(&self) -> &dyn Any;
102 fn as_any_mut(&mut self) -> &mut dyn Any;
103}