1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
use anyhow::Error as AnyError; use hyper::{ header::InvalidHeaderValue, http::Error as HttpError, Body, Error as HyperError, Response as Res, StatusCode, }; use thiserror::Error; use tokio::io::Error as TokioIoError; #[derive(Error, Debug)] pub enum ParamError { #[error("required param `{0}` not found")] RequiredParamNotFound(String), #[error("required glob param `{0}` not found")] RequiredGlobParamNotFound(String), } #[derive(Error, Debug)] pub enum Error { #[error(transparent)] Param(#[from] ParamError), #[error(transparent)] InvalidHeaderValue(#[from] InvalidHeaderValue), #[error(transparent)] TokioIo(#[from] TokioIoError), #[error(transparent)] Hyper(#[from] HyperError), #[error(transparent)] Http(#[from] HttpError), #[error(transparent)] Other(#[from] AnyError), } impl Error { pub fn respond(self) -> Result<Res<Body>, HttpError> { match self { Self::Param(_) | Self::TokioIo(_) => Res::builder() .status(StatusCode::NOT_FOUND) .body(Body::empty()), _ => Res::builder() .status(StatusCode::INTERNAL_SERVER_ERROR) .body(Body::empty()), } } }