use std::sync::Arc;
use async_trait::async_trait;
use super::error::VerifyError;
use super::port::AuthProvider;
pub struct MemoryAuthProvider<S> {
outcome: Arc<dyn Fn(&str) -> Result<S, VerifyError> + Send + Sync>,
}
impl<S> MemoryAuthProvider<S>
where
S: Clone + Send + Sync + 'static,
{
pub fn new<F>(outcome: F) -> Self
where
F: Fn(&str) -> Result<S, VerifyError> + Send + Sync + 'static,
{
Self {
outcome: Arc::new(outcome),
}
}
}
#[async_trait]
impl<S> AuthProvider<S> for MemoryAuthProvider<S>
where
S: Clone + Send + Sync + 'static,
{
async fn verify_token(&self, bearer: &str) -> Result<S, VerifyError> {
(self.outcome)(bearer)
}
}