axum_session_manager/
layer.rs

1use std::marker::PhantomData;
2
3use tower::Layer;
4
5use crate::{manager::SessionManage, service::SessionManagerService};
6/// A layer for providing SessionManagerService.  
7/// You can implement session management as a middlware by passing `axum::route::Router::layer`
8
9#[derive(Debug, Clone)]
10pub struct SessionManagerLayer<'a, P, T>
11where
12    P: SessionManage<T>,
13{
14    sessions: P,
15    session_id_key: &'a str,
16    phantome: PhantomData<T>,
17}
18
19/// Create SessionManagerLayer.    
20impl<'a, P, T> SessionManagerLayer<'a, P, T>
21where
22P: SessionManage<T>,
23{
24    /// sessions mean session pool.sessions need to implement [`SessionManage`] Trait  
25    /// session_id_key is same cookie key you want use.   
26    pub fn new(sessions: P, session_id_key: &'a str, phantome: PhantomData<T>) -> Self {
27        Self {
28            sessions,
29            session_id_key,
30            phantome,
31        }
32    }
33}
34
35// we can use middleware by using axum::routing::Router::layer
36impl<'a, S, P, T> Layer<S> for SessionManagerLayer<'a, P, T>
37where
38    P: SessionManage<T>,
39{
40    type Service = SessionManagerService<'a, S, P, T>;
41
42    fn layer(&self, inner: S) -> Self::Service {
43        SessionManagerService::new(
44            inner,
45            self.sessions.clone(),
46            self.session_id_key,
47            self.phantome.clone(),
48        )
49    }
50}