use std::fmt::{self, Write};
const MAX_LINE_OCTETS: usize = 75;
pub struct FoldingWriter<'a> {
out: &'a mut (dyn Write + 'a),
line_octets: usize,
}
impl<'a> FoldingWriter<'a> {
#[inline]
pub(crate) fn new(out: &'a mut (dyn Write + 'a)) -> Self {
Self {
out,
line_octets: 0,
}
}
#[inline]
pub(crate) fn end_line(&mut self) -> fmt::Result {
self.line_octets = 0;
self.out.write_str("\r\n")
}
}
impl Write for FoldingWriter<'_> {
fn write_str(&mut self, mut s: &str) -> fmt::Result {
while !s.is_empty() {
let remaining = MAX_LINE_OCTETS - self.line_octets;
let mut length = s.len().min(remaining);
while !s.is_char_boundary(length) {
length -= 1;
}
if length == 0 {
self.out.write_str("\r\n ")?;
self.line_octets = 1;
continue;
}
self.out.write_str(&s[..length])?;
self.line_octets += length;
s = &s[length..];
}
Ok(())
}
}