use async_trait::async_trait;
use parking_lot::RwLock;
use std::collections::HashMap;
use std::sync::Arc;
use crate::auth::config::AuthConfig;
use crate::auth::credential::AuthCredential;
use crate::error::Result;
#[async_trait]
pub trait BaseAuthProvider: Send + Sync + std::fmt::Debug + 'static {
async fn get_auth_credential(&self, config: &AuthConfig) -> Result<Option<AuthCredential>>;
}
#[derive(Debug, Default)]
pub struct AuthProviderRegistry {
by_tag: RwLock<HashMap<String, Arc<dyn BaseAuthProvider>>>,
}
impl AuthProviderRegistry {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn register(&self, tag: impl Into<String>, provider: Arc<dyn BaseAuthProvider>) {
self.by_tag.write().insert(tag.into(), provider);
}
#[must_use]
pub fn get(&self, tag: &str) -> Option<Arc<dyn BaseAuthProvider>> {
self.by_tag.read().get(tag).cloned()
}
}