// TODO: Slightâ„¢ code duplication with `ui/error.rs` use crate::routes::ui::error::MyError; use rocket::{ response::{self, Responder}, Request, http::Status, catch, }; use serde_json::{json, Value}; use std::fmt::Display; #[catch(default)] pub fn r_api_catch<'a>(status: Status, _request: &Request) -> Value { json!({ "error": format!("{status}") }) } pub type ApiResult = Result; #[derive(Debug)] pub struct ApiError(pub anyhow::Error); impl<'r> Responder<'r, 'static> for ApiError { fn respond_to(self, req: &'r Request<'_>) -> response::Result<'static> { json!({ "error": format!("{}", self.0) }).respond_to(req) } } impl Display for ApiError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.0.fmt(f) } } impl From for ApiError { fn from(err: anyhow::Error) -> ApiError { ApiError(err) } } impl From for ApiError { fn from(err: std::fmt::Error) -> ApiError { ApiError(anyhow::anyhow!("{err}")) } } impl From for ApiError { fn from(err: std::io::Error) -> Self { ApiError(anyhow::anyhow!("{err}")) } } impl From for ApiError { fn from(err: sled::Error) -> Self { ApiError(anyhow::anyhow!("{err}")) } } impl From for ApiError { fn from(err: serde_json::Error) -> Self { ApiError(anyhow::anyhow!("{err}")) } } impl From for ApiError { fn from(value: MyError) -> Self { Self(value.0) } }