diff --git a/src/cli/update.rs b/src/cli/update.rs index cbbf182..0c3a00d 100644 --- a/src/cli/update.rs +++ b/src/cli/update.rs @@ -1,6 +1,6 @@ //! The update subcommand used to get the latest allowed signers and write them to the output file. -use crate::{AllowedSignersEntry, Config, Source, SshPublicKey}; -use std::collections::{HashMap, HashSet}; +use crate::{AllowedSignersEntry, Config, SourceMap, SshPublicKey}; +use std::collections::HashSet; pub(super) fn update(config: Config) { let sources = config.get_sources(); @@ -16,6 +16,6 @@ pub(super) fn update(config: Config) { } } -fn get_public_keys(user: (), sources: &HashMap>) -> Vec { +fn get_public_keys(user: (), sources: &SourceMap) -> Vec { todo!("Retrieve public keys for a user from all sources."); } diff --git a/src/config.rs b/src/config.rs index 6f71ab2..4b3c1eb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -use crate::Source; +use crate::{Github, Gitlab, Source, SourceMap}; use figment::{ providers::{Format, Serialized, Toml}, Figment, @@ -46,8 +46,18 @@ impl Default for Config { impl Config { /// Get the configured sources. #[must_use] - pub fn get_sources(&self) -> HashMap> { - todo!() + pub fn get_sources(&self) -> SourceMap { + self.sources + .iter() + .map(|source_config| { + let name = source_config.name.clone(); + let source: Box = match source_config.provider { + SourceType::Github => Box::new(Github::new(source_config.url.parse().unwrap())), + SourceType::Gitlab => Box::new(Gitlab::new(source_config.url.parse().unwrap())), + }; + (name, source) + }) + .collect() } /// Load the configuration from a TOML file, using defaults for values that were not provided. diff --git a/src/lib.rs b/src/lib.rs index e84a0da..3d5cd0c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ pub use config::Config; pub use core::*; pub use signer::{AllowedSignersEntry, AllowedSignersFile}; -pub use source::Source; +pub use source::{Github, Gitlab, Source, SourceMap}; pub mod cli; mod config; diff --git a/src/source/main.rs b/src/source/main.rs index 22190bf..e23cf33 100644 --- a/src/source/main.rs +++ b/src/source/main.rs @@ -1,5 +1,6 @@ use crate::SshPublicKey; use async_trait::async_trait; +use std::collections::HashMap; /// A source implements a way to get public keys from a Git provider. #[async_trait] @@ -11,3 +12,6 @@ pub trait Source { client: &reqwest::Client, ) -> Result, reqwest::Error>; } + +/// A `HashMap` containing named sources. +pub type SourceMap = HashMap>; diff --git a/src/source/mod.rs b/src/source/mod.rs index 4008ec9..f5580df 100644 --- a/src/source/mod.rs +++ b/src/source/mod.rs @@ -1,4 +1,6 @@ -pub use main::Source; +pub use github::Github; +pub use gitlab::Gitlab; +pub use main::{Source, SourceMap}; mod github; mod gitlab;