use std::fmt::{
self,
Debug,
Display,
Formatter,
Write as _,
};
use crate::{
LogOutputLimit,
text::internal::BoundedLogEscapeWriter,
};
use super::internal::with_mask_byte_limit;
#[must_use = "format the bounded redacted view"]
pub struct BoundedRedactedDisplay<D> {
value: D,
limit: LogOutputLimit,
}
impl<D> BoundedRedactedDisplay<D> {
#[inline(always)]
pub(crate) const fn new(value: D, limit: LogOutputLimit) -> Self {
Self { value, limit }
}
}
impl<D: Debug> Display for BoundedRedactedDisplay<D> {
#[inline(always)]
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
format_bounded(&self.value, self.limit, formatter)
}
}
fn format_bounded(
value: &dyn Debug,
limit: LogOutputLimit,
formatter: &mut Formatter<'_>,
) -> fmt::Result {
let mut writer = BoundedLogEscapeWriter::new(limit);
let result = with_mask_byte_limit(limit.max_bytes(), || {
write!(&mut writer, "{value:?}")
});
if result.is_err() && !writer.is_truncated() {
return Err(fmt::Error);
}
formatter.write_str(&writer.finish())
}