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);
}