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}