Skip to main content

lc_testkit/
error.rs

1//! lc-testkit 的错误类型与到 `ProviderError` 的桥接。
2
3use lc_providers::ProviderError;
4
5/// lc-testkit 统一错误。
6///
7/// 通过 [`From<TestkitError> for ProviderError`] 桥接,让录播/回放 provider
8/// 可以直接喂给 chains 等要求 `L::Error: Into<ProviderError>` 的泛型入口。
9#[derive(Debug, thiserror::Error)]
10#[non_exhaustive]
11pub enum TestkitError {
12    /// 录制/回放过程中的 IO 错误(读文件、写文件等)。
13    #[error("io error while recording/replaying: {0}")]
14    Io(#[from] std::io::Error),
15    /// 回放队列耗尽:请求条数超过录制条数。
16    #[error("replay queue exhausted (requested {requested} messages, no recording left)")]
17    ReplayExhausted { requested: usize },
18    /// `ReplayStrategy::Exact` 下请求消息签名在录播中无匹配(显式报错,不做
19    /// 静默 FIFO 兜底);`left` 为队列剩余条数,便于排查录播与请求的字段漂移。
20    #[error("replay has no recording matching request messages (strategy=Exact, {left} exchange(s) left)")]
21    ReplayNoMatch { left: usize },
22    /// 内层模型错误,无损透传真实 provider 错误。
23    #[error("inner model error: {0}")]
24    Inner(#[from] ProviderError),
25}
26
27impl From<TestkitError> for ProviderError {
28    fn from(e: TestkitError) -> Self {
29        match e {
30            // 无损透传真实 provider 错误。
31            TestkitError::Inner(p) => p,
32            // 其余为 testkit 自身错误 → 经 From<String> 落到 ProviderError::Testkit。
33            other => other.to_string().into(),
34        }
35    }
36}