use http::HeaderValue;
use crate::{grant::CompletedLogin, session_state::Session};
pub type SessionError = Box<dyn std::error::Error + Send + Sync>;
pub(crate) fn to_session_err(e: impl std::error::Error + Send + Sync + 'static) -> SessionError {
Box::new(e)
}
#[doc(hidden)]
pub mod sealed {
pub trait Sealed {}
}
pub trait SessionDriver: sealed::Sealed + Send + Sync {
type SessionType: Session + Send + Sync + 'static;
type LoadError: std::error::Error + Send + Sync + 'static;
fn create(
&self,
completed: CompletedLogin,
default_lifetime: std::time::Duration,
headers: &http::HeaderMap,
) -> impl Future<Output = Result<(Self::SessionType, Vec<HeaderValue>), SessionError>> + Send;
fn load(
&self,
headers: &http::HeaderMap,
) -> impl Future<Output = Result<Option<Self::SessionType>, Self::LoadError>> + Send;
fn save(
&self,
session: &Self::SessionType,
headers: &http::HeaderMap,
) -> impl Future<Output = Result<Vec<HeaderValue>, SessionError>> + Send;
fn touch(
&self,
_session: &Self::SessionType,
_headers: &http::HeaderMap,
) -> impl Future<Output = Result<Vec<HeaderValue>, SessionError>> + Send {
async { Ok(vec![]) }
}
fn delete(
&self,
session: &Self::SessionType,
headers: &http::HeaderMap,
) -> impl Future<Output = Result<Vec<HeaderValue>, SessionError>> + Send;
}