extern crate std;
use std::io::Write;
use anyhow::anyhow;
use crate::draw::Renderer;
use crate::terminal::TerminalConst;
pub struct StdoutRenderer(pub std::io::Stdout);
impl Default for StdoutRenderer {
fn default() -> Self {
Self(std::io::stdout())
}
}
impl Renderer for StdoutRenderer {
fn render(&mut self, terminal: impl TerminalConst) -> crate::Result<()> {
let terminal_width = terminal.width();
let characters = terminal.cells();
for (idx, character_cell) in characters.enumerate() {
if idx % terminal_width == 0 {
writeln!(self.0).map_err(|e| anyhow!(e))?;
}
let mut character_cell = *character_cell;
if character_cell.character.is_whitespace() || character_cell.character.is_control() {
character_cell.character = ' ';
}
write!(self.0, "{character_cell}").map_err(|e| anyhow!(e))?;
}
self.0.flush()?;
Ok(())
}
}