1use std::collections::HashMap;
5
6use reifydb_core::interface::auth::AuthenticationProvider;
7use reifydb_runtime::context::clock::Clock;
8
9use crate::method::{github::GithubProvider, password::PasswordProvider, solana::SolanaProvider, token::TokenProvider};
10
11pub struct AuthenticationRegistry {
12 providers: HashMap<String, Box<dyn AuthenticationProvider>>,
13}
14
15impl AuthenticationRegistry {
16 pub fn new(clock: Clock) -> Self {
17 let mut providers: HashMap<String, Box<dyn AuthenticationProvider>> = HashMap::new();
18 providers.insert("password".to_string(), Box::new(PasswordProvider));
19 providers.insert("token".to_string(), Box::new(TokenProvider));
20 providers.insert("solana".to_string(), Box::new(SolanaProvider::new(clock)));
21 providers.insert("github".to_string(), Box::new(GithubProvider));
22 Self {
23 providers,
24 }
25 }
26
27 pub fn register(&mut self, provider: Box<dyn AuthenticationProvider>) {
28 self.providers.insert(provider.method().to_string(), provider);
29 }
30
31 pub fn get(&self, method: &str) -> Option<&dyn AuthenticationProvider> {
32 self.providers.get(method).map(|p| p.as_ref())
33 }
34}
35
36impl Default for AuthenticationRegistry {
37 fn default() -> Self {
38 Self::new(Clock::Real)
39 }
40}