Gouzi Mohaled
Ajout du dossier lib
84d2a97
use std::collections::hash_map::DefaultHasher;
use std::collections::{BTreeMap, HashMap};
use std::hash::{Hash, Hasher};
use chrono::{DateTime, Utc};
pub trait Anonymize {
fn anonymize(&self) -> Self;
}
impl<T: Anonymize> Anonymize for Option<T> {
fn anonymize(&self) -> Self {
self.as_ref().map(|t| t.anonymize())
}
}
impl<T: Anonymize> Anonymize for Vec<T> {
fn anonymize(&self) -> Self {
self.iter().map(|e| e.anonymize()).collect()
}
}
impl<T: Anonymize> Anonymize for Box<T> {
fn anonymize(&self) -> Self {
Box::new(self.as_ref().anonymize())
}
}
impl<K: Anonymize + Hash + Eq, V: Anonymize> Anonymize for HashMap<K, V> {
fn anonymize(&self) -> Self {
self.iter()
.map(|(k, v)| (k.anonymize(), v.anonymize()))
.collect()
}
}
impl<K: Anonymize + Eq + Ord, V: Anonymize> Anonymize for BTreeMap<K, V> {
fn anonymize(&self) -> Self {
self.iter()
.map(|(k, v)| (k.anonymize(), v.anonymize()))
.collect()
}
}
impl Anonymize for String {
fn anonymize(&self) -> Self {
let mut hasher = DefaultHasher::new();
self.hash(&mut hasher);
hasher.finish().to_string()
}
}
impl Anonymize for usize {
fn anonymize(&self) -> Self {
let log10 = (*self as f32).log10().round() as u32;
if log10 > 4 {
let skip_digits = log10 - 4;
let coeff = 10usize.pow(skip_digits);
(*self / coeff) * coeff
} else {
*self
}
}
}
impl Anonymize for DateTime<Utc> {
fn anonymize(&self) -> Self {
let coeff: f32 = rand::random();
*self + chrono::Duration::try_seconds(((coeff * 20.0) - 10.0) as i64).unwrap_or_default()
}
}