use rocket::{ http::Status, response::{self, Responder}, Request, }; use rocket_okapi::{ gen::OpenApiGenerator, okapi::openapi3::Responses, response::OpenApiResponderInner, util::ensure_status_code_exists, }; use thiserror::Error; use zone_core::Container; pub type Result = std::result::Result; #[derive(Error, Debug)] pub enum Error { #[error("Container Error {0:?}")] Container(Container), #[error("ZFS Error {source:?}")] ZFS { #[from] source: zone_zfs::Error, }, #[error("NSpawn Error {source:?}")] Nspawn { #[from] source: zone_nspawn::Error, }, #[error(transparent)] Other(#[from] anyhow::Error), } impl<'r, 'o: 'r> Responder<'r, 'o> for Error { fn respond_to(self, req: &'r Request<'_>) -> response::Result<'o> { // https://stuarth.github.io/rocket-error-handling/ // match self { // _ => Status::InternalServerError.respond_to(req), // } Status::InternalServerError.respond_to(req) } } impl OpenApiResponderInner for Error { fn responses(_gen: &mut OpenApiGenerator) -> rocket_okapi::Result { let mut responses = Responses::default(); ensure_status_code_exists(&mut responses, 500); Ok(responses) } }