Skip to main content

chat_core/
error.rs

1use crate::types::metadata::Metadata;
2use thiserror::Error;
3
4#[derive(Clone, Debug, Error)]
5pub enum ChatError {
6    #[error("network error: {0}")]
7    Network(String),
8
9    #[error("provider error: {0}")]
10    Provider(String),
11
12    #[error("rate limited")]
13    RateLimited,
14
15    #[error("exceeded maximum steps")]
16    MaxStepsExceeded,
17
18    #[error("invalid response: {0}")]
19    InvalidResponse(String),
20
21    #[error("error in callback function: {0}")]
22    Callback(String),
23
24    #[error("unknown error: {0}")]
25    Other(String),
26}
27
28impl ChatError {
29    /// Whether this error is transient and worth retrying.
30    ///
31    /// Retryable: `RateLimited`, `Network` (transient failures).
32    /// Not retryable: `Provider`, `InvalidResponse`, `MaxStepsExceeded`,
33    /// `Callback`, `Other` (request/response or client-side issues).
34    pub fn is_retryable(&self) -> bool {
35        matches!(self, ChatError::RateLimited | ChatError::Network(_))
36    }
37}
38
39#[derive(Clone, Debug, Error)]
40#[error("Chat engine failed: {err}")]
41pub struct ChatFailure {
42    pub metadata: Option<Metadata>,
43    #[source]
44    pub err: ChatError,
45}
46
47impl ChatFailure {
48    pub fn from_err<E: Into<ChatError>>(err: E) -> Self {
49        Self {
50            metadata: None,
51            err: err.into(),
52        }
53    }
54}