use std::io::{Result, Write};
pub(crate) fn write_indent(indent: usize, write: &mut dyn Write) -> Result<()> {
write!(write, "{}", " ".repeat(indent))
}
pub trait WriteLine {
fn write_line(&self, indent: usize, write: &mut dyn Write) -> Result<()>;
}
pub(crate) trait WriteString {
fn write_string(&self) -> String;
}
impl<T: WriteString> WriteString for Box<T> {
fn write_string(&self) -> String {
(**self).write_string()
}
}
impl<T: WriteString> WriteString for &T {
fn write_string(&self) -> String {
(*self).write_string()
}
}
impl<T: WriteString> WriteString for Option<T> {
fn write_string(&self) -> String {
if let Some(this) = self {
this.write_string()
} else {
"".to_string()
}
}
}
pub fn write<T: WriteLine>(t: &T, write: &mut dyn Write) -> Result<()> {
t.write_line(0, write)
}