use serde::{
Serialize,
ser::SerializeMap,
};
use crate::{
RedactValue,
RedactionPolicy,
};
#[doc(hidden)]
pub trait RedactMapSerialize<K: ?Sized, V: ?Sized> {
fn serialize_redacted_map<S>(
&self,
policy: &RedactionPolicy,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: serde::Serializer;
}
impl<M: ?Sized, K: ?Sized, V: ?Sized> RedactMapSerialize<K, V> for M
where
for<'a> &'a M: IntoIterator<Item = (&'a K, &'a V)>,
K: AsRef<str> + Serialize,
V: RedactValue + Serialize,
{
#[inline]
fn serialize_redacted_map<S>(
&self,
policy: &RedactionPolicy,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut map = serializer.serialize_map(None)?;
for (key, value) in self {
if let Some(level) = policy.sensitivity_for(key.as_ref()) {
let redacted = value.redact_value(level, policy.masking());
map.serialize_entry(key, &redacted)?;
} else {
map.serialize_entry(key, value)?;
}
}
map.end()
}
}