thruster 1.1.1

A middleware based http async web server.
Documentation
use hyper::Body;
use log::info;
use thruster::context::hyper_request::HyperRequest;
use thruster::context::typed_hyper_context::TypedHyperContext;
use thruster::hyper_server::HyperServer;
use thruster::{async_middleware, middleware_fn};
use thruster::{App, ThrusterServer};
use thruster::{MiddlewareNext, MiddlewareResult};

use std::sync::Arc;
use std::sync::RwLock;

type Ctx = TypedHyperContext<RequestConfig>;

struct ServerConfig {
    val: Arc<RwLock<String>>,
}

struct RequestConfig {
    latest_value: Arc<RwLock<String>>,
}

fn generate_context(request: HyperRequest, state: &ServerConfig, _path: &str) -> Ctx {
    Ctx::new(
        request,
        RequestConfig {
            latest_value: state.val.clone(),
        },
    )
}

#[middleware_fn]
async fn state_setter(mut context: Ctx, _next: MiddlewareNext<Ctx>) -> MiddlewareResult<Ctx> {
    let latest_value = context.extra.latest_value.clone();
    let mut latest_value = latest_value.write().unwrap();
    context.body = Body::from(format!("last value: {}", latest_value));
    *latest_value = context
        .params
        .as_ref()
        .unwrap()
        .get("val")
        .unwrap()
        .to_string();

    Ok(context)
}

#[middleware_fn]
async fn state_getter(mut context: Ctx, _next: MiddlewareNext<Ctx>) -> MiddlewareResult<Ctx> {
    let latest_value = context.extra.latest_value.clone();
    let latest_value = latest_value.read().unwrap();
    context.body = Body::from(format!("current value: {}", latest_value));

    Ok(context)
}

fn main() {
    env_logger::init();
    info!("Starting server...");

    let mut app = App::<HyperRequest, Ctx, ServerConfig>::create(
        generate_context,
        ServerConfig {
            val: Arc::new(RwLock::new("original".to_string())),
        },
    );
    app.get("/set-value/:val", async_middleware!(Ctx, [state_setter]));
    app.get("/get-value", async_middleware!(Ctx, [state_getter]));

    let server = HyperServer::new(app);
    server.start("0.0.0.0", 4321);
}