use std::fmt;
#[derive(Debug)]
pub enum ElevenLabsSFXError {
RequestError(reqwest::Error),
ApiError { status: u16, message: String },
ParseError(serde_json::Error),
AuthenticationError(String),
RateLimitError {
retry_after: Option<u64>, message: String,
},
QuotaExceededError(String),
ValidationError(String),
}
impl fmt::Display for ElevenLabsSFXError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ElevenLabsSFXError::RequestError(e) => write!(f, "Request failed: {}", e),
ElevenLabsSFXError::ApiError { status, message } => {
write!(f, "API error ({}): {}", status, message)
}
ElevenLabsSFXError::ParseError(e) => write!(f, "Failed to parse response: {}", e),
ElevenLabsSFXError::AuthenticationError(msg) => {
write!(f, "Authentication failed: {}", msg)
}
ElevenLabsSFXError::RateLimitError {
retry_after,
message,
} => match retry_after {
Some(seconds) => write!(
f,
"Rate limit exceeded (retry in {}s): {}",
seconds, message
),
None => write!(f, "Rate limit exceeded: {}", message),
},
ElevenLabsSFXError::QuotaExceededError(msg) => write!(f, "Quota exceeded: {}", msg),
ElevenLabsSFXError::ValidationError(msg) => write!(f, "Validation error: {}", msg),
}
}
}
impl std::error::Error for ElevenLabsSFXError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
ElevenLabsSFXError::RequestError(e) => Some(e),
ElevenLabsSFXError::ParseError(e) => Some(e),
_ => None,
}
}
}
impl From<reqwest::Error> for ElevenLabsSFXError {
fn from(error: reqwest::Error) -> Self {
if let Some(status) = error.status() {
let status_code = status.as_u16();
match status_code {
401 => ElevenLabsSFXError::AuthenticationError("Invalid API key".to_string()),
429 => {
ElevenLabsSFXError::RateLimitError {
retry_after: None, message: "Too many requests".to_string(),
}
}
402 => ElevenLabsSFXError::QuotaExceededError("Insufficient credits".to_string()),
_ => ElevenLabsSFXError::ApiError {
status: status_code,
message: error.to_string(),
},
}
} else {
ElevenLabsSFXError::RequestError(error)
}
}
}
impl From<serde_json::Error> for ElevenLabsSFXError {
fn from(error: serde_json::Error) -> Self {
ElevenLabsSFXError::ParseError(error)
}
}