zeroentropy_community/
error.rs1use thiserror::Error;
2
3pub type Result<T> = std::result::Result<T, Error>;
5
6#[derive(Error, Debug)]
8pub enum Error {
9 #[error("HTTP request failed: {0}")]
11 Http(#[from] reqwest::Error),
12
13 #[error("API error ({status}): {message}")]
15 Api {
16 status: u16,
17 message: String,
18 },
19
20 #[error("Bad request: {0}")]
22 BadRequest(String),
23
24 #[error("Authentication failed: {0}")]
26 AuthenticationError(String),
27
28 #[error("Permission denied: {0}")]
30 PermissionDenied(String),
31
32 #[error("Not found: {0}")]
34 NotFound(String),
35
36 #[error("Conflict: {0}")]
38 Conflict(String),
39
40 #[error("Unprocessable entity: {0}")]
42 UnprocessableEntity(String),
43
44 #[error("Rate limit exceeded: {0}")]
46 RateLimitExceeded(String),
47
48 #[error("Internal server error: {0}")]
50 InternalServerError(String),
51
52 #[error("JSON error: {0}")]
54 Json(#[from] serde_json::Error),
55
56 #[error("Invalid API key: API key must be provided either via constructor or ZEROENTROPY_API_KEY environment variable")]
58 InvalidApiKey,
59
60 #[error("IO error: {0}")]
62 Io(#[from] std::io::Error),
63
64 #[error("Base64 error: {0}")]
66 Base64(#[from] base64::DecodeError),
67}
68
69impl Error {
70 pub fn from_status(status: u16, message: String) -> Self {
72 match status {
73 400 => Error::BadRequest(message),
74 401 => Error::AuthenticationError(message),
75 403 => Error::PermissionDenied(message),
76 404 => Error::NotFound(message),
77 409 => Error::Conflict(message),
78 422 => Error::UnprocessableEntity(message),
79 429 => Error::RateLimitExceeded(message),
80 500..=599 => Error::InternalServerError(message),
81 _ => Error::Api { status, message },
82 }
83 }
84}