via 1.0.1

An async multi-threaded web framework for people who appreciate simplicity.
Documentation
use http::Method;

use super::{BoxFuture, Middleware, Next};
use crate::{Request, Response, Result};

pub struct AllowMethod<T> {
    middleware: T,
    predicate: Method,
}

pub fn connect<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::CONNECT, middleware)
}

pub fn delete<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::DELETE, middleware)
}

pub fn get<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::GET, middleware)
}

pub fn head<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::HEAD, middleware)
}

pub fn options<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::OPTIONS, middleware)
}

pub fn patch<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::PATCH, middleware)
}

pub fn post<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::POST, middleware)
}

pub fn put<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::PUT, middleware)
}

pub fn trace<State, T>(middleware: T) -> AllowMethod<T>
where
    T: Middleware<State>,
{
    AllowMethod::new(Method::TRACE, middleware)
}

impl<T> AllowMethod<T> {
    pub(crate) fn new(predicate: Method, middleware: T) -> Self {
        Self {
            middleware,
            predicate,
        }
    }
}

impl<State, T> Middleware<State> for AllowMethod<T>
where
    T: Middleware<State>,
    State: Send + Sync + 'static,
{
    fn call(&self, request: Request<State>, next: Next<State>) -> BoxFuture<Result<Response>> {
        if self.predicate == request.method() {
            self.middleware.call(request, next)
        } else {
            next.call(request)
        }
    }
}