use axum::{ body::{self, boxed}, response::{IntoResponse, Response}, }; use hyper::StatusCode; use thiserror::Error; #[derive(Debug, Error)] pub enum ServiceError { #[error("Solarlib error: {0}")] Solarlib(#[from] solarlib::errors::Error), #[error("Axum error: {0}")] Axum(#[from] axum::Error), #[error("SQL error: {0}")] Sql(#[from] sqlx::Error), #[error("Not Found")] NotFound, #[error("Not Authorized")] NotAuthorized, } pub type StringResult = Result; pub type JsonResult = Result; impl IntoResponse for ServiceError { fn into_response(self) -> Response { let body = body::boxed(body::Full::from(self.to_string())); let status = match self { ServiceError::NotFound => StatusCode::NOT_FOUND, ServiceError::NotAuthorized => StatusCode::UNAUTHORIZED, _ => StatusCode::INTERNAL_SERVER_ERROR, }; Response::builder().status(status).body(body).unwrap() } }