use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
#[derive(Debug, thiserror::Error)]
pub enum AppError {
#[error("config error: {0}")]
Config(String),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
#[error("storage error: {0}")]
Storage(String),
#[error("rss fetch error: {0}")]
Fetch(String),
#[error("rss parse error: {0}")]
Parse(String),
#[error("llm api error: {0}")]
Llm(String),
#[error("not found: {0}")]
NotFound(String),
}
impl From<toml::de::Error> for AppError {
fn from(e: toml::de::Error) -> Self {
AppError::Config(e.to_string())
}
}
impl From<toml::ser::Error> for AppError {
fn from(e: toml::ser::Error) -> Self {
AppError::Config(e.to_string())
}
}
impl From<tera::Error> for AppError {
fn from(e: tera::Error) -> Self {
AppError::Storage(format!("template: {}", e))
}
}
impl IntoResponse for AppError {
fn into_response(self) -> Response {
let (status, msg) = match &self {
AppError::NotFound(_) => (StatusCode::NOT_FOUND, self.to_string()),
_ => (StatusCode::INTERNAL_SERVER_ERROR, self.to_string()),
};
(status, msg).into_response()
}
}