mod.rs 55 lignes · 1526 octets
/// Discord OAuth provider implementation.
pub mod discord;
/// GitHub OAuth provider implementation.
pub mod github;
/// Google OIDC provider implementation.
pub mod google;
/// Microsoft OIDC provider implementation.
pub mod microsoft;

use super::provider_trait::OAuthProvider;
use std::collections::HashMap;
use std::sync::Arc;

/// Registry of available OAuth providers, indexed by name.
pub struct ProviderRegistry {
    providers: HashMap<String, Arc<dyn OAuthProvider>>,
}

impl ProviderRegistry {
    /// Create an empty provider registry.
    pub fn new() -> Self {
        Self {
            providers: HashMap::new(),
        }
    }

    /// Register an OAuth provider, replacing any existing registration with the same name.
    pub fn register(&mut self, provider: Arc<dyn OAuthProvider>) {
        self.providers.insert(provider.name().to_string(), provider);
    }

    /// Look up a provider by its name identifier.
    pub fn get(&self, name: &str) -> Option<&Arc<dyn OAuthProvider>> {
        self.providers.get(name)
    }

    /// Return a list of `(name, display_name)` pairs for all registered providers.
    pub fn list(&self) -> Vec<(&str, &str)> {
        self.providers
            .values()
            .map(|p| (p.name(), p.display_name()))
            .collect()
    }

    /// Return `true` if no providers are registered.
    pub fn is_empty(&self) -> bool {
        self.providers.is_empty()
    }
}

impl Default for ProviderRegistry {
    fn default() -> Self {
        Self::new()
    }
}