Skip to main content

ek_core/
error.rs

1//! 错误体系:全部公共 API 的错误面。
2
3use std::fmt;
4
5/// 宿主注册/生命周期错误。
6///
7/// 0.2.0 变更:移除 `HostStarted` 变体——运行期动态 add 合法(新 D1);
8/// 仅 `Stopped`(宿主已 close)仍拒绝一切变更。
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub enum PluginError {
11    /// 插件名不合法(规则:首字母字母,其余 alnum/_/-,长度 1..=32)。
12    IllegalName(String),
13    /// 重名注册。
14    Duplicate(String),
15    /// deps 指向的目标在 start 时不存在(add 期不再校验——解耦注册顺序)。
16    UnknownDep(String),
17    /// start 时 deps 构成环(列出环上点名)。
18    DepCycle(Vec<String>),
19    /// get/remove 等操作目标不存在。
20    UnknownName(String),
21    /// 宿主已 close():一切变更被拒。
22    Stopped,
23}
24
25impl fmt::Display for PluginError {
26    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27        match self {
28            Self::IllegalName(n) => write!(f, "illegal plugin name: {n:?}"),
29            Self::Duplicate(n) => write!(f, "duplicate plugin: {n:?}"),
30            Self::UnknownDep(n) => write!(f, "unknown dependency at start: {n:?}"),
31            Self::DepCycle(c) => write!(f, "dependency cycle: {c:?}"),
32            Self::UnknownName(n) => write!(f, "unknown plugin: {n:?}"),
33            Self::Stopped => write!(f, "host closed"),
34        }
35    }
36}
37impl std::error::Error for PluginError {}
38
39/// 请求应答(ask/ask_service)错误。
40#[derive(Debug, Clone, PartialEq, Eq)]
41pub enum AskError {
42    /// 目标 worker 未能在时限内回包(目标慢/挂/积压)。
43    ///
44    /// 0.5.0 带 `pending` = **超时那一刻目标邮箱里排了多少帧**(目标已摘 → 0)。
45    /// 目的:把"慢"从猜测变成读数 —— 消费侧能显示「积压 N 帧、刷新滞后 ~X 秒」,
46    /// 而不是只剩一个干巴巴的超时。
47    Timeout { target: String, pending: u64 },
48    /// 目标不存在/未 Running/已被检疫或移除(尽力而为的预检 + 断连快失败)。
49    TargetGone { target: String },
50    /// 请求的服务在全宿主中无人声明(find_service 无提供方)。
51    UnknownService { service: String },
52    /// 回包/请求契约不匹配(错型信封,或 B 明确回 Err(InvalidPayload))。
53    InvalidPayload { target: String },
54    /// 总线已停(put 失败)。
55    BusStopped,
56}
57
58impl fmt::Display for AskError {
59    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
60        match self {
61            Self::Timeout { target, pending } => {
62                if *pending == 0 {
63                    write!(f, "ask timeout: {target}")
64                } else {
65                    write!(f, "ask timeout: {target}(目标积压 {pending} 帧)")
66                }
67            }
68            Self::TargetGone { target } => write!(f, "ask target gone: {target}"),
69            Self::UnknownService { service } => write!(f, "unknown service: {service}"),
70            Self::InvalidPayload { target } => write!(f, "ask invalid payload/contract: {target}"),
71            Self::BusStopped => write!(f, "bus stopped"),
72        }
73    }
74}
75impl std::error::Error for AskError {}