1use std::fmt;
10
11#[derive(Clone, Debug, PartialEq, Eq)]
12pub enum CoreError {
13 InvalidDelegation(String),
15 InvalidIntent(String),
17 UnknownDelegation(String),
19 DuplicateDelegation(String),
21 LedgerOverflow(String),
23 CommitRejected(String),
26 WalIo(String),
28 WalLocked { path: String, message: String },
31 WalBadLine { line: u64, message: String },
33 WalChainBroken { line: u64, message: String },
36 WalMismatch { line: u64, message: String },
38 AnchorInvalid(String),
41 AnchorMismatch(String),
44 Pending(crate::pending::PendingError),
47}
48
49impl fmt::Display for CoreError {
50 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51 match self {
52 CoreError::InvalidDelegation(m) => write!(f, "委托注册被拒(非法配置): {m}"),
53 CoreError::InvalidIntent(m) => write!(f, "消费意图非法: {m}"),
54 CoreError::UnknownDelegation(id) => write!(f, "未知委托: {id}"),
55 CoreError::DuplicateDelegation(id) => write!(f, "委托重复注册: {id}"),
56 CoreError::LedgerOverflow(m) => write!(f, "账本溢出(状态异常,fail-closed): {m}"),
57 CoreError::CommitRejected(m) => write!(f, "commit 被拒(闸未放行,API 误用): {m}"),
58 CoreError::WalIo(m) => write!(f, "审计日志 IO 失败(fail-closed): {m}"),
59 CoreError::WalLocked { path, message } => {
60 write!(
61 f,
62 "审计日志单写者锁被占(fail-closed 拒启): {message}[锁文件: {path}]"
63 )
64 }
65 CoreError::WalBadLine { line, message } => {
66 write!(
67 f,
68 "审计日志第 {line} 行损坏(fail-closed,不静默跳过): {message}"
69 )
70 }
71 CoreError::WalChainBroken { line, message } => {
72 write!(
73 f,
74 "审计日志第 {line} 行完整性链断裂(fail-closed): {message}"
75 )
76 }
77 CoreError::WalMismatch { line, message } => {
78 write!(
79 f,
80 "审计日志第 {line} 行回放对账不一致(fail-closed): {message}"
81 )
82 }
83 CoreError::AnchorInvalid(m) => {
84 write!(f, "审计锚点文件不可信(fail-closed): {m}")
85 }
86 CoreError::AnchorMismatch(m) => {
87 write!(f, "审计日志与所有者锚点不符——审计被动过(fail-closed): {m}")
88 }
89 CoreError::Pending(e) => write!(f, "人在环待支付被拒(fail-closed): {e}"),
90 }
91 }
92}
93
94impl std::error::Error for CoreError {}