use crate::error::{CleanupError, SetupError};
use crossterm::{cursor, event, execute, terminal};
use std::io;
pub(crate) fn setup(
stdout: &io::Stdout,
dynamic: bool,
setup_screen: bool,
) -> std::result::Result<(), SetupError> {
let mut out = stdout.lock();
if setup_screen {
if dynamic {
use crossterm::tty::IsTty;
if out.is_tty() {
Ok(())
} else {
Err(SetupError::InvalidTerminal)
}?;
}
execute!(out, terminal::EnterAlternateScreen)
.map_err(|e| SetupError::AlternateScreen(e.into()))?;
terminal::enable_raw_mode().map_err(|e| SetupError::RawMode(e.into()))?;
execute!(out, cursor::Hide).map_err(|e| SetupError::HideCursor(e.into()))?;
execute!(out, event::EnableMouseCapture)
.map_err(|e| SetupError::EnableMouseCapture(e.into()))?;
}
Ok(())
}
pub(crate) fn cleanup(
mut out: impl io::Write,
es: &crate::ExitStrategy,
cleanup_screen: bool,
) -> std::result::Result<(), CleanupError> {
if cleanup_screen {
execute!(out, event::DisableMouseCapture)
.map_err(|e| CleanupError::DisableMouseCapture(e.into()))?;
execute!(out, cursor::Show).map_err(|e| CleanupError::ShowCursor(e.into()))?;
terminal::disable_raw_mode().map_err(|e| CleanupError::DisableRawMode(e.into()))?;
execute!(out, terminal::LeaveAlternateScreen)
.map_err(|e| CleanupError::LeaveAlternateScreen(e.into()))?;
}
if *es == crate::ExitStrategy::ProcessQuit {
std::process::exit(0);
} else {
Ok(())
}
}