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}