use crate::error::PrivacyError;
use hmac::{Hmac, Mac};
use serde::Serialize;
use sha2::Sha256;
type HmacSha256 = Hmac<Sha256>;
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize)]
pub struct PseudonymizedValue {
pub value: String,
}
pub struct Pseudonymizer {
salt: Vec<u8>,
}
impl Pseudonymizer {
pub fn new(salt: &[u8]) -> Result<Self, PrivacyError> {
if salt.is_empty() {
return Err(PrivacyError::EmptySalt);
}
Ok(Self {
salt: salt.to_vec(),
})
}
#[must_use]
pub fn pseudonymize(&self, input: &str) -> PseudonymizedValue {
let mut mac = HmacSha256::new_from_slice(&self.salt).expect("HMAC accepts any key length");
mac.update(input.as_bytes());
let result = mac.finalize();
let hex_str = hex::encode(result.into_bytes());
PseudonymizedValue { value: hex_str }
}
#[must_use]
pub fn pseudonymize_batch(&self, inputs: &[&str]) -> Vec<PseudonymizedValue> {
inputs
.iter()
.map(|input| self.pseudonymize(input))
.collect()
}
}