use std::io;
use std::io::Write;
pub(in crate::facade::redactor) struct BoundedJsonWriter {
bytes: Vec<u8>,
maximum: usize,
rejected: bool,
}
impl BoundedJsonWriter {
#[must_use]
#[inline]
pub(in crate::facade::redactor) fn new(maximum: usize) -> Self {
Self {
bytes: Vec::with_capacity(maximum.min(4096)),
maximum,
rejected: false,
}
}
#[inline]
pub(in crate::facade::redactor) fn into_bytes(self) -> io::Result<Vec<u8>> {
if self.rejected {
Err(output_limit_error())
} else {
Ok(self.bytes)
}
}
}
impl Write for BoundedJsonWriter {
#[inline]
fn write(&mut self, bytes: &[u8]) -> io::Result<usize> {
if self.rejected || bytes.len() > self.maximum.saturating_sub(self.bytes.len()) {
self.rejected = true;
return Err(output_limit_error());
}
self.bytes.extend_from_slice(bytes);
Ok(bytes.len())
}
#[inline(always)]
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
#[must_use]
#[inline]
fn output_limit_error() -> io::Error {
io::Error::new(io::ErrorKind::WriteZero, "redaction JSON output budget exceeded")
}