use thiserror::Error;
#[derive(Error, Debug)]
pub enum OrchestraError {
#[error("HTTP request failed: {0}")]
Http(#[from] reqwest::Error),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
#[error("Invalid header value: {0}")]
InvalidHeader(#[from] reqwest::header::InvalidHeaderValue),
#[error("API key error: {message}")]
ApiKey { message: String },
#[error("Provider error: {provider} - {message}")]
Provider { provider: String, message: String },
#[error("Configuration error: {message}")]
Config { message: String },
#[error("Model error: {message}")]
Model { message: String },
#[error("Rate limit exceeded: {message}")]
RateLimit { message: String },
#[error("Authentication failed: {message}")]
Authentication { message: String },
#[error("Invalid response format: {message}")]
InvalidResponse { message: String },
#[error("Request timeout: {message}")]
Timeout { message: String },
#[error("Orchestra error: {message}")]
Generic { message: String },
}
impl OrchestraError {
pub fn api_key<S: Into<String>>(message: S) -> Self {
Self::ApiKey {
message: message.into(),
}
}
pub fn provider<S: Into<String>>(provider: S, message: S) -> Self {
Self::Provider {
provider: provider.into(),
message: message.into(),
}
}
pub fn config<S: Into<String>>(message: S) -> Self {
Self::Config {
message: message.into(),
}
}
pub fn model<S: Into<String>>(message: S) -> Self {
Self::Model {
message: message.into(),
}
}
pub fn rate_limit<S: Into<String>>(message: S) -> Self {
Self::RateLimit {
message: message.into(),
}
}
pub fn authentication<S: Into<String>>(message: S) -> Self {
Self::Authentication {
message: message.into(),
}
}
pub fn invalid_response<S: Into<String>>(message: S) -> Self {
Self::InvalidResponse {
message: message.into(),
}
}
pub fn timeout<S: Into<String>>(message: S) -> Self {
Self::Timeout {
message: message.into(),
}
}
pub fn generic<S: Into<String>>(message: S) -> Self {
Self::Generic {
message: message.into(),
}
}
}
pub type Result<T> = std::result::Result<T, OrchestraError>;