satex_layer/
set_header.rs

1#![doc = include_str!("../docs/set_request_header.md")]
2#![doc = include_str!("../docs/set_response_header.md")]
3
4pub use request::MakeSetRequestHeaderRouteLayer;
5pub use response::MakeSetResponseHeaderRouteLayer;
6
7macro_rules! make_set_header {
8    ($name:ident, $make:ident, $layer:ident) => {
9        #[make(kind = $name)]
10        pub struct $make {
11            name: String,
12            value: String,
13            #[serde(default)]
14            policy: SetPolicy,
15        }
16
17        impl MakeRouteLayer for $make {
18            type Layer = $layer<HeaderValue>;
19
20            fn make(&self, args: Args) -> Result<Self::Layer, Error> {
21                let config = Config::with_args(args).map_err(Error::new)?;
22                let name = HeaderName::from_str(&config.name).map_err(Error::new)?;
23                let value = HeaderValue::from_str(&config.value).map_err(Error::new)?;
24                Ok(match config.policy {
25                    SetPolicy::Overriding => $layer::overriding(name, value),
26                    SetPolicy::Appending => $layer::appending(name, value),
27                    SetPolicy::IfNotPresent => $layer::if_not_present(name, value),
28                })
29            }
30        }
31    };
32}
33
34mod request {
35    use crate::make::MakeRouteLayer;
36    use crate::util::SetPolicy;
37    use http::{HeaderName, HeaderValue};
38    use satex_core::component::{Args, Configurable};
39    use satex_core::Error;
40    use satex_macro::make;
41    use std::str::FromStr;
42    use tower_http::set_header::SetRequestHeaderLayer;
43
44    make_set_header!(
45        SetRequestHeader,
46        MakeSetRequestHeaderRouteLayer,
47        SetRequestHeaderLayer
48    );
49}
50
51mod response {
52    use crate::make::MakeRouteLayer;
53    use crate::util::SetPolicy;
54    use http::{HeaderName, HeaderValue};
55    use satex_core::component::{Args, Configurable};
56    use satex_core::Error;
57    use satex_macro::make;
58    use std::str::FromStr;
59    use tower_http::set_header::SetResponseHeaderLayer;
60
61    make_set_header!(
62        SetResponseHeader,
63        MakeSetResponseHeaderRouteLayer,
64        SetResponseHeaderLayer
65    );
66}