use super::traits::AlleleHasher;
use super::{Crc32Hasher, HammingHasher, Md5Hasher, SequenceHasher, Sha256Hasher};
use std::collections::HashMap;
pub struct HasherRegistry {
hashers: HashMap<String, Box<dyn AlleleHasher>>,
}
impl HasherRegistry {
pub fn new() -> Self {
let mut registry = Self {
hashers: HashMap::new(),
};
registry.register_hasher("crc32", Box::new(Crc32Hasher));
registry.register_hasher("sha256", Box::new(Sha256Hasher));
registry.register_hasher("md5", Box::new(Md5Hasher));
registry.register_hasher("sequence", Box::new(SequenceHasher));
registry.register_hasher("hamming", Box::new(HammingHasher));
registry
}
pub fn register_hasher(&mut self, name: &str, hasher: Box<dyn AlleleHasher>) {
self.hashers.insert(name.to_string(), hasher);
}
pub fn get_hasher(&self, name: &str) -> Option<&dyn AlleleHasher> {
self.hashers.get(name).map(|h| h.as_ref())
}
pub fn has_hasher(&self, name: &str) -> bool {
self.hashers.contains_key(name)
}
pub fn list_hashers(&self) -> Vec<(&str, &str)> {
self.hashers
.values()
.map(|h| (h.name(), h.description()))
.collect()
}
pub fn get_hasher_names(&self) -> Vec<&str> {
self.hashers.keys().map(|s| s.as_str()).collect()
}
}
impl Default for HasherRegistry {
fn default() -> Self {
Self::new()
}
}