use ring::error::KeyRejected; use thiserror::Error; use axum::body; use axum::http::StatusCode; use axum::response::{IntoResponse, Response}; use axum::Json; use ring::error::Unspecified as RingUnspecified; #[derive(Debug, Error)] pub enum ServiceError { #[error("Solarlib error: {0}")] Solarlib(#[from] solarlib::errors::Error), #[error("Axum error: {0}")] Axum(#[from] axum::Error), #[error("Not Found")] NotFound, #[error("Reqwest: {0}")] Reqwest(#[from] reqwest::Error), #[error("Command error: {0}")] Command(#[from] std::io::Error), #[error("Not authorized")] NotAuthorized, #[error("Generic: {0}")] Generic(String), #[error("Invalid PASETO Key: {0}")] PasetoInvalid(#[from] KeyRejected), } impl From for ServiceError { fn from(_: RingUnspecified) -> Self { ServiceError::Generic("Unspecified RNG error".to_string()) } } pub type StringResult = std::result::Result; pub type TokenResult = std::result::Result; pub type JsonResult = std::result::Result; pub type NoneResult = std::result::Result<(), ServiceError>; 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() } }