use crate_protocol::ErrorBody; use poem_openapi::{ApiResponse, payload::Json}; #[derive(Debug, ApiResponse)] pub enum ApiError { #[oai(status = 400)] BadRequest(Json), #[oai(status = 401)] Unauthorized(Json), #[oai(status = 403)] Forbidden(Json), #[oai(status = 404)] NotFound(Json), #[oai(status = 409)] Conflict(Json), #[oai(status = 413)] TooLarge(Json), #[oai(status = 500)] Internal(Json), #[oai(status = 502)] BadGateway(Json), #[oai(status = 503)] Unavailable(Json), } impl ApiError { pub fn bad(message: impl Into) -> Self { Self::BadRequest(body("InvalidRequest", message)) } pub fn unauthorized() -> Self { Self::Unauthorized(body("LoginRequired", "Sign in to your PDS to continue.")) } pub fn forbidden(message: impl Into) -> Self { Self::Forbidden(body("Forbidden", message)) } pub fn not_found() -> Self { Self::NotFound(body("NotFound", "The file or directory was not found.")) } pub fn conflict(message: impl Into) -> Self { Self::Conflict(body("Conflict", message)) } pub fn too_large() -> Self { Self::TooLarge(body( "TransferLimit", "The operation exceeds the configured transfer or transaction limit.", )) } pub fn unavailable(message: impl Into) -> Self { Self::Unavailable(body("SpacesUnavailable", message)) } pub fn upstream(message: impl Into) -> Self { Self::BadGateway(body("PdsUnavailable", message)) } } pub fn body(code: impl Into, message: impl Into) -> Json { Json(ErrorBody { code: code.into(), message: message.into(), }) } impl From for ApiError { fn from(_: anyhow::Error) -> Self { Self::Internal(body( "InternalError", "The server could not complete the operation.", )) } } pub type Result = std::result::Result;