yahf 0.0.2

Yet Another HTTP Framework focused on DX
Documentation
extern crate yahf;

use std::time;
use std::time::UNIX_EPOCH;

use serde::Deserialize;
use serde::Serialize;
use yahf::handler::Json;
use yahf::request::Request;
use yahf::result::Result;

use yahf::response::Response;
use yahf::router::Router;
use yahf::server::Server;

#[derive(Debug, Deserialize, Serialize)]
struct ComputationBody {
    value: u32,
}

async fn log_middleware(req: Result<Request<String>>) -> Result<Request<String>> {
    match req.into_inner() {
        Ok(req) => {
            println!(
                "{} - {} - {}",
                time::SystemTime::now()
                    .duration_since(UNIX_EPOCH)
                    .expect("Negative time")
                    .as_millis(),
                req.method().as_str(),
                req.uri().path()
            );

            Ok(req).into()
        }
        Err(err) => Err(err).into(),
    }
}

async fn log_error(res: Result<Response<String>>) -> Result<Response<String>> {
    match res.into_inner() {
        Err(err) => {
            println!(
                "{} - {}",
                time::SystemTime::now()
                    .duration_since(UNIX_EPOCH)
                    .expect("Negative time")
                    .as_millis(),
                err.code(),
            );
            Err(err).into()
        }
        ok => ok.into(),
    }
}

async fn first_computation(req: ComputationBody) -> ComputationBody {
    ComputationBody {
        value: req.value + 1,
    }
}

async fn second_computation(req: ComputationBody) -> ComputationBody {
    ComputationBody {
        value: req.value * 2,
    }
}

#[tokio::main]
async fn main() {
    let router = Router::new()
        .pre(log_middleware)
        .get("/first", first_computation, &Json::new(), &Json::new());

    let server = Server::new()
        .after(log_error)
        .get("/second", second_computation, &Json::new(), &Json::new())
        .router(router);

    server
        .listen(([127, 0, 0, 1], 8000).into())
        .await
        .unwrap();
}