Spaces:
Build error
Build error
File size: 1,775 Bytes
84d2a97 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
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()
}
}
|