use super::traits::{AlleleHash, AlleleHasher};
#[derive(Debug, Clone)]
pub struct Sha256Hasher;
impl AlleleHasher for Sha256Hasher {
fn hash_sequence(&self, sequence: &str) -> AlleleHash {
use sha2::{Digest, Sha256};
let mut hasher = Sha256::new();
hasher.update(sequence.as_bytes());
let hash_str = format!("{:x}", hasher.finalize());
AlleleHash::String(hash_str)
}
fn parse_allele(&self, allele_str: &str, missing_char: &str) -> Result<AlleleHash, String> {
let cleaned = allele_str.trim();
if cleaned.is_empty() || cleaned == "NA" || cleaned == missing_char {
return Ok(AlleleHash::Missing);
}
if cleaned.len() == 64 && cleaned.chars().all(|c| c.is_ascii_hexdigit()) {
Ok(AlleleHash::String(cleaned.to_string()))
} else {
Ok(self.hash_sequence(cleaned))
}
}
fn name(&self) -> &'static str {
"SHA256"
}
fn description(&self) -> &'static str {
"SHA256 hash for cryptographically secure allele identification"
}
}