use std::collections::HashMap;
use crate::error::AuthError;
pub trait CredentialProvider: Send + Sync {
fn get_secret_key(&self, access_key_id: &str) -> Result<String, AuthError>;
}
#[derive(Debug, Clone)]
pub struct StaticCredentialProvider {
credentials: HashMap<String, String>,
}
impl StaticCredentialProvider {
pub fn new(credentials: impl IntoIterator<Item = (String, String)>) -> Self {
Self {
credentials: credentials.into_iter().collect(),
}
}
}
impl CredentialProvider for StaticCredentialProvider {
fn get_secret_key(&self, access_key_id: &str) -> Result<String, AuthError> {
self.credentials
.get(access_key_id)
.cloned()
.ok_or_else(|| AuthError::AccessKeyNotFound(access_key_id.to_owned()))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_should_return_secret_key_for_known_access_key() {
let provider =
StaticCredentialProvider::new(vec![("AKID".to_owned(), "secret".to_owned())]);
let result = provider.get_secret_key("AKID");
assert!(result.is_ok());
assert_eq!(result.unwrap(), "secret");
}
#[test]
fn test_should_return_error_for_unknown_access_key() {
let provider = StaticCredentialProvider::new(vec![]);
let result = provider.get_secret_key("UNKNOWN");
assert!(matches!(result, Err(AuthError::AccessKeyNotFound(_))));
}
}