use std::fmt::Display;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error("provider error: {0}")]
ProviderError(String),
#[error("authentication error: {0}")]
AuthenticationError(String),
#[error("client error: {0}")]
HttpError(#[from] rig::http_client::Error),
#[error("prompt error: {0}")]
PromptError(#[from] rig::completion::PromptError),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
#[error("rpc error: {0}")]
RpcError(#[from] tarpc::client::RpcError),
#[error("invalid jwt credentials: {0}")]
InvalidJWTCredentials(#[from] jsonwebtoken::errors::Error),
#[error("no jwt secret found")]
NoJWTSecretFound,
}
impl Error {
fn status(&self) -> u16 {
match self {
Error::AuthenticationError(_) | Error::InvalidJWTCredentials(_) => 401,
Error::HttpError(_)
| Error::Io(_)
| Error::PromptError(_)
| Error::RpcError(_)
| Error::ProviderError(_)
| Error::NoJWTSecretFound => 500,
}
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct ApiError {
status: u16,
message: String,
}
impl Display for ApiError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}: {}", self.status, self.message)
}
}
impl From<Error> for ApiError {
fn from(value: Error) -> Self {
Self {
status: value.status(),
message: value.to_string(),
}
}
}
impl std::error::Error for ApiError {}