shield_tower/
layer.rs

1use shield::{Shield, User};
2use tower_layer::Layer;
3
4use crate::service::ShieldService;
5
6pub const SESSION_KEY: &str = "shield";
7
8#[derive(Clone)]
9pub struct ShieldLayer<U: User> {
10    shield: Shield<U>,
11    session_key: &'static str,
12}
13
14impl<U: User> ShieldLayer<U> {
15    pub fn new(shield: Shield<U>) -> Self {
16        Self::new_with_session_key(shield, SESSION_KEY)
17    }
18
19    pub fn new_with_session_key(shield: Shield<U>, session_key: &'static str) -> Self {
20        Self {
21            shield,
22            session_key,
23        }
24    }
25}
26
27impl<S, U: User + Clone> Layer<S> for ShieldLayer<U> {
28    type Service = ShieldService<S, U>;
29
30    fn layer(&self, inner: S) -> Self::Service {
31        ShieldService::new(inner, self.shield.clone(), self.session_key)
32    }
33}