use core::str;
use std::io;
use crate::{
common::{IndentWrite, IndentWriterCommon, IndentWriterImpl},
marker,
};
impl<W: io::Write> IndentWrite<marker::IO> for W {
type Error = io::Error;
fn write_char(&mut self, c: char) -> Result<(), Self::Error> {
self.write_str(c.encode_utf8(&mut [0; 4]))
}
fn write_str(&mut self, str: &str) -> Result<(), Self::Error> {
<Self as io::Write>::write_all(self, str.as_bytes())
}
fn flush(&mut self) -> Result<(), Self::Error> {
<Self as io::Write>::flush(self)
}
}
pub struct IndentWriter<'buffer, W: io::Write> {
inner: IndentWriterImpl<'buffer, marker::IO, W>,
}
impl<'buffer, W: io::Write> IndentWriter<'buffer, W> {
pub fn new(w: &'buffer mut W, indent: usize) -> Self {
Self {
inner: IndentWriterImpl::new(w, indent),
}
}
pub fn with_raw_buffer<R, F: FnOnce(&mut W) -> R>(&mut self, f: F) -> R {
f(self.inner.wrapped)
}
}
impl<W: io::Write> IndentWriterCommon for IndentWriter<'_, W> {
fn increase_indent(&mut self) {
self.inner.increase_indent();
}
fn decrease_indent(&mut self) {
self.inner.decrease_indent();
}
fn indent_if_needed(&mut self) {
let _ = self.inner.indent_if_needed();
}
}
impl<W: io::Write> io::Write for IndentWriter<'_, W> {
fn write(&mut self, str: &[u8]) -> io::Result<usize> {
self.inner
.write_str(str::from_utf8(str).map_err(io::Error::other)?)?;
Ok(str.len())
}
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
}