use std::io;
use std::io::{stdout, Write};
use std::rc::Rc;
use crate::console::component::SendableComponent;
pub trait ConsoleReceiver {
fn send(&self, component: &dyn SendableComponent) -> io::Result<()>;
}
pub struct ConsoleSender {
console: Box<dyn ConsoleReceiver>,
}
impl ConsoleSender {
pub fn new<R: ConsoleReceiver + 'static>(receiver: R) -> ConsoleSender {
ConsoleSender {
console: Box::new(receiver)
}
}
pub fn send<C: SendableComponent>(&self, component: C) -> io::Result<()> {
self.console.send(&component)
}
}
impl ConsoleReceiver for io::Stdout {
fn send(&self, component: &dyn SendableComponent) -> io::Result<()> {
let mut stdout = stdout();
writeln!(stdout, "{}", component)?;
Ok(())
}
}