pub const DIGEST_KEY_LEN: usize = 48;
pub type DigestKey = [u8; DIGEST_KEY_LEN];
pub trait HashKeyable {
fn to_key(&self) -> DigestKey;
}
impl<T: AsRef<[u8]>> HashKeyable for T {
fn to_key(&self) -> DigestKey {
let mut key = [0u8; DIGEST_KEY_LEN];
let bytes = self.as_ref();
let len = std::cmp::min(bytes.len(), DIGEST_KEY_LEN);
key[..len].copy_from_slice(&bytes[..len]);
key
}
}
pub(crate) fn key_to_digest_string(key: &DigestKey) -> String {
let len = key.iter().position(|&b| b == 0).unwrap_or(DIGEST_KEY_LEN);
String::from_utf8_lossy(&key[..len]).to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ga4gh_digest_roundtrip() {
let digest = "SQ.KH8TQq_rHNXuRAfzbjTTnRL_k0ZMznaM";
assert_eq!(digest.len(), 35);
let key: DigestKey = digest.to_key();
let recovered = key_to_digest_string(&key);
assert_eq!(recovered, digest, "digest was truncated during roundtrip");
}
}