use std::collections::HashMap;
use std::sync::Arc;
use auths_core::ports::namespace::{Ecosystem, NamespaceVerifier, NamespaceVerifyError};
use auths_infra_http::namespace::{CargoVerifier, NpmVerifier, PypiVerifier};
pub struct NamespaceVerifierRegistry {
verifiers: HashMap<Ecosystem, Arc<dyn NamespaceVerifier>>,
}
impl NamespaceVerifierRegistry {
pub fn new() -> Self {
Self {
verifiers: HashMap::new(),
}
}
pub fn register(&mut self, verifier: Arc<dyn NamespaceVerifier>) {
self.verifiers.insert(verifier.ecosystem(), verifier);
}
pub fn get(&self, ecosystem: Ecosystem) -> Option<&Arc<dyn NamespaceVerifier>> {
self.verifiers.get(&ecosystem)
}
pub fn require(
&self,
ecosystem: Ecosystem,
) -> Result<&Arc<dyn NamespaceVerifier>, NamespaceVerifyError> {
self.verifiers
.get(&ecosystem)
.ok_or_else(|| NamespaceVerifyError::UnsupportedEcosystem {
ecosystem: ecosystem.as_str().to_string(),
})
}
pub fn with_defaults() -> Self {
let mut registry = Self::new();
registry.register(Arc::new(CargoVerifier::new()));
registry.register(Arc::new(NpmVerifier::new()));
registry.register(Arc::new(PypiVerifier::new()));
registry
}
}
impl Default for NamespaceVerifierRegistry {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn registry_require_missing_ecosystem() {
let registry = NamespaceVerifierRegistry::new();
let result = registry.require(Ecosystem::Cargo);
assert!(result.is_err());
let err = result.err().unwrap();
assert!(matches!(
err,
NamespaceVerifyError::UnsupportedEcosystem { .. }
));
}
#[test]
fn registry_with_defaults_has_cargo_npm_pypi() {
let registry = NamespaceVerifierRegistry::with_defaults();
assert!(registry.get(Ecosystem::Cargo).is_some());
assert!(registry.get(Ecosystem::Npm).is_some());
assert!(registry.get(Ecosystem::Pypi).is_some());
assert!(registry.get(Ecosystem::Docker).is_none());
assert!(registry.get(Ecosystem::Go).is_none());
}
#[test]
fn registry_require_registered_ecosystem() {
let registry = NamespaceVerifierRegistry::with_defaults();
let verifier = registry.require(Ecosystem::Cargo).unwrap();
assert_eq!(verifier.ecosystem(), Ecosystem::Cargo);
}
}