arcly_http/web/
plugin_routes.rs1use axum::routing::{on, MethodFilter, MethodRouter};
9
10use crate::core::engine::FrozenDiContainer;
11use crate::core::plugins::PluginRoute;
12use crate::observability::lean_telemetry::on_request_start;
13use crate::web::boundary::{assemble_context, InFlightGuard};
14
15#[doc(hidden)]
16pub fn build_plugin_route(
17 container: &'static FrozenDiContainer,
18 route: &PluginRoute,
19) -> MethodRouter {
20 let filter = MethodFilter::try_from(axum::http::Method::from(route.method))
21 .expect("supported HTTP method");
22 let h = route.handler.clone();
23
24 let handler = move |req: axum::extract::Request| {
25 let h = h.clone();
26 async move {
27 let (parts, body) = req.into_parts();
28 let ctx = assemble_context(parts, body, Default::default(), container, "", None).await;
31
32 let _guard = on_request_start();
33 let _in_flight = InFlightGuard::new();
34 h(ctx).await
35 }
36 };
37
38 on(filter, handler)
39}