Skip to main content

anthropic_rs/
error.rs

1use std::str::Utf8Error;
2
3use serde::Deserialize;
4
5use crate::client::ApiVersionError;
6
7#[derive(Debug, thiserror::Error)]
8pub enum AnthropicError {
9    #[error("API error: {0}")]
10    Api(ApiErrorResponse),
11
12    #[error("HTTP client error: {0}")]
13    Network(#[from] reqwest::Error),
14
15    #[error("API version error: {0}")]
16    ApiVersion(#[from] ApiVersionError),
17
18    #[error("URL parse error: {0}")]
19    UrlParse(String),
20
21    #[error("Failed to deserialize: {0}")]
22    JsonDeserialize(#[from] serde_json::Error),
23
24    #[error("Invalid header value: {0}")]
25    InvalidHeaderValue(#[from] reqwest::header::InvalidHeaderValue),
26
27    #[error("Model not supported: {0}")]
28    ModelNotSupported(String),
29
30    #[error("Missing API key {0}")]
31    MissingApiKey(&'static str),
32
33    #[error("Invalid Stream Event")]
34    InvalidStreamEvent,
35
36    #[error("UTF8 Error: {0}")]
37    Utf8Error(#[from] Utf8Error),
38
39    #[error("Unexpected error: {0}")]
40    Unexpected(String),
41}
42
43#[derive(Debug, Deserialize, PartialEq, Eq, thiserror::Error)]
44#[error("Error response: {error_type} {error}")]
45pub struct ApiErrorResponse {
46    #[serde(rename = "type")]
47    pub error_type: String,
48    pub error: ApiErrorDetail,
49}
50
51#[derive(Debug, Deserialize, PartialEq, Eq, thiserror::Error)]
52#[error("Api error: {error_type} {message}")]
53pub struct ApiErrorDetail {
54    #[serde(rename = "type")]
55    pub error_type: ApiErrorType,
56    pub message: String,
57}
58
59#[derive(Debug, Deserialize, PartialEq, Eq, thiserror::Error)]
60pub enum ApiErrorType {
61    #[error("invalid_request_error")]
62    #[serde(rename = "invalid_request_error")]
63    InvalidRequest,
64
65    #[error("authentication_error")]
66    #[serde(rename = "authentication_error")]
67    Authentication,
68
69    #[error("permission_error")]
70    #[serde(rename = "permission_error")]
71    Permission,
72
73    #[error("not_found_error")]
74    #[serde(rename = "not_found_error")]
75    NotFound,
76
77    #[error("request_too_large")]
78    #[serde(rename = "request_too_large")]
79    RequestTooLarge,
80
81    #[error("rate_limit_error")]
82    #[serde(rename = "rate_limit_error")]
83    RateLimit,
84
85    #[error("api_error")]
86    #[serde(rename = "api_error")]
87    Unexpected,
88
89    #[error("overloaded_error")]
90    #[serde(rename = "overloaded_error")]
91    Overloaded,
92}
93
94#[cfg(test)]
95mod tests {
96    use super::*;
97    use pretty_assertions::assert_eq;
98
99    #[test]
100    fn should_serialize_to_correct_error_values() {
101        assert_eq!(
102            &ApiErrorType::InvalidRequest.to_string(),
103            "invalid_request_error"
104        );
105        assert_eq!(
106            &ApiErrorType::Authentication.to_string(),
107            "authentication_error"
108        );
109        assert_eq!(&ApiErrorType::Permission.to_string(), "permission_error");
110        assert_eq!(&ApiErrorType::NotFound.to_string(), "not_found_error");
111        assert_eq!(
112            &ApiErrorType::RequestTooLarge.to_string(),
113            "request_too_large"
114        );
115        assert_eq!(&ApiErrorType::RateLimit.to_string(), "rate_limit_error");
116        assert_eq!(&ApiErrorType::Unexpected.to_string(), "api_error");
117        assert_eq!(&ApiErrorType::Overloaded.to_string(), "overloaded_error");
118    }
119}