submillisecond 0.4.1

A lunatic web framework for Rust.
Documentation
use submillisecond::params::Params;
use submillisecond::response::Response;
use submillisecond::{router, Application, Guard, Handler, RequestContext};

fn global_middleware(req: RequestContext) -> Response {
    println!("[GLOBAL] ENTRY");
    let res = req.next_handler();
    println!("[GLOBAL] EXIT");
    res
}

struct LoggingMiddleware {
    level: u8,
}

impl LoggingMiddleware {
    const fn new(level: u8) -> Self {
        LoggingMiddleware { level }
    }
}

impl Handler for LoggingMiddleware {
    fn handle(&self, req: RequestContext) -> Response {
        if self.level == 0 {
            return req.next_handler();
        }

        println!("{} {}", req.method(), req.uri().path());
        let res = req.next_handler();
        println!("[EXIT]");
        res
    }
}

fn foo_bar_handler() -> &'static str {
    "foo bar"
}

fn foo_handler(params: Params) -> &'static str {
    println!("{params:#?}");
    "foo"
}

fn bar_handler() -> &'static str {
    "bar"
}

struct BarGuard;
impl Guard for BarGuard {
    fn check(&self, _: &RequestContext) -> bool {
        true
    }
}

struct FooGuard;
impl Guard for FooGuard {
    fn check(&self, _: &RequestContext) -> bool {
        true
    }
}

fn main() -> std::io::Result<()> {
    const LOGGER: LoggingMiddleware = LoggingMiddleware::new(1);

    Application::new(router! {
        with global_middleware;

        "/foo" if FooGuard => {
            with LOGGER;

            GET "/bar" if BarGuard => foo_bar_handler
        }
        GET "/bar" if BarGuard with LOGGER => bar_handler
        POST "/foo" with LOGGER => foo_handler
    })
    .serve("0.0.0.0:3000")
}