use crate::{
private::{AddExtensionLayer, UseSecureCookies},
SigningKey,
};
use cookie::Key;
use tower_cookies::CookieManagerLayer;
use tower_layer::{Layer, Stack};
pub fn layer(signing_key: Key) -> LayerBuilder<AddExtensionLayer<SigningKey>> {
LayerBuilder {
layer: AddExtensionLayer::new(SigningKey(signing_key)),
}
}
#[derive(Debug, Clone)]
pub struct LayerBuilder<L> {
layer: L,
}
impl<L> LayerBuilder<L> {
pub fn with_cookie_manager(self) -> LayerBuilder<Stack<CookieManagerLayer, L>> {
self.push(CookieManagerLayer::new())
}
pub fn use_secure_cookies(
self,
use_secure_cookies: bool,
) -> LayerBuilder<Stack<AddExtensionLayer<UseSecureCookies>, L>> {
self.push(AddExtensionLayer::new(UseSecureCookies(use_secure_cookies)))
}
fn push<L2>(self, layer: L2) -> LayerBuilder<Stack<L2, L>> {
LayerBuilder {
layer: Stack::new(layer, self.layer),
}
}
}
impl<L, S> Layer<S> for LayerBuilder<L>
where
L: Layer<S>,
{
type Service = L::Service;
fn layer(&self, inner: S) -> Self::Service {
self.layer.layer(inner)
}
}