use std::collections::BTreeMap;
use super::{
SensitiveFieldPreset,
SensitivityLevel,
canonicalize_field_name,
default_sensitive_fields::DEFAULT_EXTRA_FIELDS,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SensitiveFields {
fields: BTreeMap<String, SensitivityLevel>,
}
impl SensitiveFields {
pub fn new() -> Self {
Self {
fields: BTreeMap::new(),
}
}
pub fn insert(&mut self, field: &str, level: SensitivityLevel) {
let field = canonicalize_field_name(field);
if !field.is_empty() {
self.fields.insert(field, level);
}
}
pub fn extend<I, S>(&mut self, fields: I, level: SensitivityLevel)
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
{
for field in fields {
self.insert(field.as_ref(), level);
}
}
pub fn extend_preset(&mut self, preset: SensitiveFieldPreset) {
for (field, level) in preset.fields() {
self.insert(field, *level);
}
}
pub fn contains(&self, field: &str) -> bool {
self.level_for(field).is_some()
}
pub fn level_for(&self, field: &str) -> Option<SensitivityLevel> {
self.fields.get(&canonicalize_field_name(field)).copied()
}
pub fn len(&self) -> usize {
self.fields.len()
}
pub fn is_empty(&self) -> bool {
self.fields.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = (&str, SensitivityLevel)> {
self.fields
.iter()
.map(|(field, level)| (field.as_str(), *level))
}
}
impl Default for SensitiveFields {
fn default() -> Self {
let mut fields = Self::new();
for preset in [
SensitiveFieldPreset::Credentials,
SensitiveFieldPreset::AuthTokens,
SensitiveFieldPreset::Http,
SensitiveFieldPreset::Session,
] {
fields.extend_preset(preset);
}
for (field, level) in DEFAULT_EXTRA_FIELDS {
fields.insert(field, level);
}
fields
}
}