use std::fmt::Write as _;
use crate::{
InputOutputLimit,
LogOutputLimit,
text::internal::BoundedLogEscapeWriter,
};
use super::RedactedArgv;
pub(super) const TRUNCATED_ITEM: &str = "<truncated>";
pub(super) struct RedactedArgvBuilder {
writer: BoundedLogEscapeWriter,
has_item: bool,
}
impl RedactedArgvBuilder {
#[inline]
pub(super) fn new(budget: InputOutputLimit) -> Self {
let limit = LogOutputLimit::from(budget);
let mut writer = BoundedLogEscapeWriter::new(limit);
let _ = writer.write_str("[");
Self {
writer,
has_item: false,
}
}
#[inline]
pub(super) fn push(&mut self, item: &str) -> bool {
if self.has_item {
let _ = self.writer.write_str(", ");
}
let _ = write!(self.writer, "{item:?}");
self.has_item = true;
!self.writer.is_truncated()
}
#[inline]
pub(super) fn finish(mut self) -> RedactedArgv {
if !self.writer.is_truncated() {
let _ = self.writer.write_str("]");
}
RedactedArgv::from_rendered(self.writer.finish())
}
}