mendes 0.9.4

Rust web toolkit for impatient perfectionists
Documentation
#![cfg(all(feature = "application", feature = "hyper", feature = "body-util"))]

use async_trait::async_trait;
use bytes::Bytes;
use http_body_util::Full;
use mendes::application::IntoResponse;
use mendes::http::request::Parts;
use mendes::http::{Response, StatusCode};
use mendes::hyper::body::Incoming;
use mendes::{handler, route, Application, Context};

#[handler(GET)]
async fn hello(_: &App) -> Result<Response<Full<Bytes>>, Error> {
    Ok(Response::builder()
        .status(StatusCode::OK)
        .body("Hello, world".into())
        .unwrap())
}

struct App {}

#[async_trait]
impl Application for App {
    type RequestBody = Incoming;
    type ResponseBody = Full<Bytes>;
    type Error = Error;

    async fn handle(mut cx: Context<Self>) -> Response<Full<Bytes>> {
        route!(match cx.path() {
            _ => hello,
        })
    }
}

#[derive(Debug)]
enum Error {
    Mendes(mendes::Error),
}

impl From<mendes::Error> for Error {
    fn from(e: mendes::Error) -> Self {
        Error::Mendes(e)
    }
}

impl From<&Error> for StatusCode {
    fn from(e: &Error) -> StatusCode {
        let Error::Mendes(e) = e;
        StatusCode::from(e)
    }
}

impl IntoResponse<App> for Error {
    fn into_response(self, _: &App, _: &Parts) -> Response<Full<Bytes>> {
        let Error::Mendes(err) = self;
        Response::builder()
            .status(StatusCode::from(&err))
            .body(Full::new(Bytes::from(err.to_string())))
            .unwrap()
    }
}