wick_config/config/app_config/triggers/http/
middleware.rs1use std::collections::HashMap;
2use std::path::Path;
3
4use wick_packet::RuntimeConfig;
5
6use super::WickRouter;
7use crate::config::template_config::Renderable;
8use crate::config::{self, Binding, ComponentOperationExpression, ImportDefinition};
9use crate::error::ManifestError;
10
11#[derive(
12 Debug,
13 Clone,
14 derive_builder::Builder,
15 PartialEq,
16 derive_asset_container::AssetManager,
17 property::Property,
18 serde::Serialize,
19)]
20#[property(get(public), set(private), mut(public, suffix = "_mut"))]
21#[asset(asset(config::AssetReference))]
22pub struct Middleware {
24 #[serde(skip_serializing_if = "Vec::is_empty")]
26 pub(crate) request: Vec<ComponentOperationExpression>,
27 #[serde(skip_serializing_if = "Vec::is_empty")]
29 pub(crate) response: Vec<ComponentOperationExpression>,
30}
31
32impl Renderable for Middleware {
33 fn render_config(
34 &mut self,
35 source: Option<&Path>,
36 root_config: Option<&RuntimeConfig>,
37 env: Option<&HashMap<String, String>>,
38 ) -> Result<(), ManifestError> {
39 self.request.render_config(source, root_config, env)?;
40 self.response.render_config(source, root_config, env)
41 }
42}
43
44pub(super) fn expand_for_middleware_components(
45 trigger_index: usize,
46 router_index: usize,
47 router: &mut impl WickRouter,
48 bindings: &mut Vec<Binding<ImportDefinition>>,
49) -> Result<(), ManifestError> {
50 if let Some(middleware) = router.middleware_mut() {
51 for (i, operation) in middleware.request_mut().iter_mut().enumerate() {
52 let id = format!(
53 "trigger_{}_router_{}_request_middleware_{}",
54 trigger_index, router_index, i
55 );
56 operation.maybe_import(&id, bindings);
57 }
58 for (i, operation) in middleware.response_mut().iter_mut().enumerate() {
59 let id = format!(
60 "trigger_{}_router_{}_response_middleware_{}",
61 trigger_index, router_index, i
62 );
63 operation.maybe_import(&id, bindings);
64 }
65 }
66
67 Ok(())
68}