use {Screen, TerminalOutput};
use super::super::cursor;
use super::super::input;
use super::super::style;
use super::super::terminal;
use std::fmt::Display;
use std::sync::Arc;
pub struct Crossterm {
stdout: Option<Arc<TerminalOutput>>,
}
impl<'crossterm> Crossterm {
pub fn new() -> Crossterm {
Crossterm { stdout: None }
}
pub fn from_screen(screen: &Screen) -> Crossterm {
Crossterm {
stdout: Some(screen.stdout.clone()),
}
}
pub fn cursor(&self) -> cursor::TerminalCursor {
match &self.stdout {
None => cursor::TerminalCursor::new(),
Some(stdout) => cursor::TerminalCursor::from_output(&stdout),
}
}
pub fn input(&self) -> input::TerminalInput {
match &self.stdout {
None => input::TerminalInput::new(),
Some(stdout) => input::TerminalInput::from_output(&stdout),
}
}
pub fn terminal(&self) -> terminal::Terminal {
match &self.stdout {
None => terminal::Terminal::new(),
Some(stdout) => terminal::Terminal::from_output(&stdout),
}
}
pub fn color(&self) -> style::TerminalColor {
match &self.stdout {
None => style::TerminalColor::new(),
Some(stdout) => style::TerminalColor::from_output(&stdout),
}
}
pub fn style<D>(&self, val: D) -> style::StyledObject<D>
where
D: Display,
{
style::ObjectStyle::new().apply_to(val)
}
}
impl From<Arc<TerminalOutput>> for Crossterm {
fn from(stdout: Arc<TerminalOutput>) -> Self {
Crossterm {
stdout: Some(stdout),
}
}
}
impl From<Screen> for Crossterm {
fn from(screen: Screen) -> Self {
Crossterm {
stdout: Some(screen.stdout.clone()),
}
}
}