thruster_async_await/
lib.rs

1use std::io;
2use std::future::Future;
3
4use thruster_core::context::Context;
5use thruster_core::request::{RequestWithParams};
6use thruster_core::route_parser::{MatchedRoute};
7#[cfg(feature = "thruster_error_handling")]
8use thruster_core::errors::Error;
9
10pub fn resolve<R: RequestWithParams, T: 'static + Context + Send>(context_generator: fn(R) -> T, mut request: R, matched_route: MatchedRoute<T>) -> impl Future<Output=Result<T::Response, io::Error>> + Send {
11  request.set_params(matched_route.params);
12
13  let context = (context_generator)(request);
14
15  let copy = matched_route.middleware.clone();
16  async move {
17    let ctx = copy.run(context).await;
18
19    #[cfg(feature = "thruster_error_handling")]
20    let ctx = match ctx {
21      Ok(val) => val,
22      Err(e) => {
23        e.build_context()
24      }
25    };
26
27    Ok(ctx.get_response())
28  }
29}