1#![doc = include_str!("../../docs/cors.md")]
2
3mod value;
4
5use crate::cors::value::Value;
6use crate::make::MakeRouteLayer;
7use http::{HeaderName, HeaderValue, Method};
8use satex_core::component::{Args, Configurable};
9use satex_core::Error;
10use satex_macro::make;
11use std::time::Duration;
12use tower_http::cors::CorsLayer;
13
14#[make(kind = "Cors", shortcut_mode = "Unsupported")]
15struct MakeCorsRouteLayer {
16 max_age_secs: Option<u64>,
17 allow_credentials: Option<bool>,
18 allow_private_network: Option<bool>,
19 #[serde(default)]
20 allow_headers: Value<HeaderName>,
21 #[serde(default)]
22 allow_methods: Value<Method>,
23 #[serde(default)]
24 allow_origin: Value<HeaderValue>,
25 #[serde(default)]
26 expose_headers: Value<HeaderName>,
27 #[serde(default)]
28 vary: Value<HeaderName>,
29}
30
31impl MakeRouteLayer for MakeCorsRouteLayer {
32 type Layer = CorsLayer;
33
34 fn make(&self, args: Args) -> Result<Self::Layer, Error> {
35 let config = Config::with_args(args)?;
36 let mut layer = CorsLayer::default()
37 .allow_headers(config.allow_headers)
38 .allow_origin(config.allow_origin)
39 .allow_methods(config.allow_methods)
40 .expose_headers(config.expose_headers)
41 .vary(config.vary);
42
43 if let Some(allow_credentials) = config.allow_credentials {
44 layer = layer.allow_credentials(allow_credentials);
45 }
46 if let Some(max_age_secs) = config.max_age_secs {
47 layer = layer.max_age(Duration::from_secs(max_age_secs));
48 }
49 if let Some(allow_private_network) = config.allow_private_network {
50 layer = layer.allow_private_network(allow_private_network);
51 }
52
53 Ok(layer)
54 }
55}