use std::fmt;
#[cfg(feature = "serde")]
use serde::Serialize;
#[cfg(feature = "serde")]
use serde::Serializer;
use crate::Redact;
use crate::Redactor;
#[cfg(feature = "serde")]
use crate::domain::internal::RedactSerializeSource;
#[cfg(feature = "serde")]
use crate::domain::internal::RedactedProjectionRef;
pub struct RedactedView<'value, T: ?Sized> {
value: &'value T,
redactor: Redactor,
}
impl<'value, T: ?Sized> RedactedView<'value, T> {
#[must_use]
#[inline(always)]
pub(crate) fn new(value: &'value T, redactor: Redactor) -> Self {
Self { value, redactor }
}
}
impl<T: Redact + ?Sized> fmt::Display for RedactedView<'_, T> {
#[inline(always)]
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.redactor.redact_text(self.value).text().as_str())
}
}
impl<T: Redact + ?Sized> fmt::Debug for RedactedView<'_, T> {
#[inline(always)]
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(self, formatter)
}
}
#[cfg(feature = "serde")]
impl<'value, T: RedactSerializeSource + ?Sized> Serialize for RedactedView<'value, T>
where
T::RedactedFields<'value>: Serialize,
{
#[inline(always)]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
RedactedProjectionRef::new(self.value, self.redactor.policy()).serialize(serializer)
}
}