use crate::prelude::*;
use crate::ui::canvas::Canvas;
use dev_null_writer::DevNullWriter;
use editor_writer::EditorWriter;
use headless_writer::HeadlessWriter;
pub mod dev_null_writer;
pub mod editor_writer;
pub mod headless_writer;
mod tui;
pub trait StdoutWritable {
fn init(&self) -> IoResult<()>;
fn init_complete(&mut self, canvas: &mut Canvas) -> IoResult<()>;
fn shutdown(&self) -> IoResult<()>;
fn write(&mut self, canvas: &mut Canvas) -> IoResult<()>;
}
#[derive(Debug)]
pub enum StdoutWriterValue {
EditorWriter(EditorWriter),
HeadlessWriter(HeadlessWriter),
DevNullWriter(DevNullWriter),
}
impl StdoutWritable for StdoutWriterValue {
fn init(&self) -> IoResult<()> {
match self {
StdoutWriterValue::EditorWriter(w) => w.init(),
StdoutWriterValue::HeadlessWriter(w) => w.init(),
StdoutWriterValue::DevNullWriter(w) => w.init(),
}
}
fn init_complete(&mut self, canvas: &mut Canvas) -> IoResult<()> {
match self {
StdoutWriterValue::EditorWriter(w) => w.init_complete(canvas),
StdoutWriterValue::HeadlessWriter(w) => w.init_complete(canvas),
StdoutWriterValue::DevNullWriter(w) => w.init_complete(canvas),
}
}
fn shutdown(&self) -> IoResult<()> {
match self {
StdoutWriterValue::EditorWriter(w) => w.shutdown(),
StdoutWriterValue::HeadlessWriter(w) => w.shutdown(),
StdoutWriterValue::DevNullWriter(w) => w.shutdown(),
}
}
fn write(&mut self, canvas: &mut Canvas) -> IoResult<()> {
match self {
StdoutWriterValue::EditorWriter(w) => w.write(canvas),
StdoutWriterValue::HeadlessWriter(w) => w.write(canvas),
StdoutWriterValue::DevNullWriter(w) => w.write(canvas),
}
}
}
impl StdoutWriterValue {
pub fn editor() -> Self {
StdoutWriterValue::EditorWriter(EditorWriter::new())
}
pub fn headless() -> Self {
StdoutWriterValue::HeadlessWriter(HeadlessWriter::new())
}
pub fn dev_null() -> Self {
StdoutWriterValue::DevNullWriter(DevNullWriter::new())
}
}