use std::fmt::{self, Arguments};
use std::io::{self, Write};
pub trait WriteStr: Write {
#[inline]
fn write_str(&mut self, buf: &str) -> io::Result<()> {
default_write_str(self, buf)
}
}
#[inline]
pub fn default_write_str<Inner: Write + ?Sized>(inner: &mut Inner, buf: &str) -> io::Result<()> {
inner.write_all(buf.as_bytes())
}
pub fn default_write_fmt<Inner: WriteStr + ?Sized>(
inner: &mut Inner,
fmt: Arguments,
) -> io::Result<()> {
struct Adaptor<'a, Inner: ?Sized + 'a> {
inner: &'a mut Inner,
error: Option<io::Error>,
}
impl<Inner: WriteStr + ?Sized> fmt::Write for Adaptor<'_, Inner> {
fn write_str(&mut self, s: &str) -> fmt::Result {
match self.inner.write_str(s) {
Ok(()) => Ok(()),
Err(e) => {
self.error = Some(e);
Err(fmt::Error)
}
}
}
}
let mut adapter = Adaptor { inner, error: None };
match fmt::write(&mut adapter, fmt) {
Ok(()) => Ok(()),
Err(_) => Err(adapter
.error
.unwrap_or_else(|| io::Error::new(io::ErrorKind::Other, "formatter error"))),
}
}