wick_config/config/app_config/triggers/http/
middleware.rs

1use 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))]
22/// Request and response operations that run before and after the main operation.
23pub struct Middleware {
24  /// The middleware to apply to requests.
25  #[serde(skip_serializing_if = "Vec::is_empty")]
26  pub(crate) request: Vec<ComponentOperationExpression>,
27  /// The middleware to apply to responses.
28  #[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}