mod grid;
use crate::ansi::ANSIFmt;
use std::fmt;
pub use grid::WritableGrid;
pub trait Typewriter {
fn start(&mut self) -> fmt::Result;
fn finish(&mut self) -> fmt::Result;
fn reset(&mut self) -> fmt::Result;
fn write_str(&mut self, text: &str, width: usize) -> fmt::Result;
fn write_char(&mut self, c: char) -> fmt::Result;
fn colorize_start<C: ANSIFmt>(&mut self, color: C) -> fmt::Result;
fn colorize_stop<C: ANSIFmt>(&mut self, color: C) -> fmt::Result;
}
impl<T> Typewriter for &mut T
where
T: Typewriter,
{
fn start(&mut self) -> fmt::Result {
T::start(self)
}
fn finish(&mut self) -> fmt::Result {
T::finish(self)
}
fn reset(&mut self) -> fmt::Result {
T::reset(self)
}
fn write_str(&mut self, text: &str, width: usize) -> fmt::Result {
T::write_str(self, text, width)
}
fn write_char(&mut self, c: char) -> fmt::Result {
T::write_char(self, c)
}
fn colorize_start<C: ANSIFmt>(&mut self, color: C) -> fmt::Result {
T::colorize_start(self, color)
}
fn colorize_stop<C: ANSIFmt>(&mut self, color: C) -> fmt::Result {
T::colorize_stop(self, color)
}
}
impl Typewriter for String {
fn start(&mut self) -> fmt::Result {
Ok(())
}
fn finish(&mut self) -> fmt::Result {
Ok(())
}
fn reset(&mut self) -> fmt::Result {
self.write_char('\n')
}
fn write_str(&mut self, text: &str, _width: usize) -> fmt::Result {
fmt::Write::write_str(self, text)
}
fn write_char(&mut self, c: char) -> fmt::Result {
fmt::Write::write_char(self, c)
}
fn colorize_start<C: ANSIFmt>(&mut self, color: C) -> fmt::Result {
color.fmt_ansi_prefix(self)
}
fn colorize_stop<C: ANSIFmt>(&mut self, color: C) -> fmt::Result {
color.fmt_ansi_suffix(self)
}
}