ltrender 0.1.2

a diff based terminal rendering engine
Documentation
use crossterm::{
    cursor::{Hide, MoveTo, Show},
    event::{DisableMouseCapture, EnableMouseCapture},
    execute,
    terminal::{
        Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode,
        enable_raw_mode,
    },
};
use std::io::{Result, stdout};

#[macro_export]
macro_rules! init_terminal {
    () => {
        $crate::initial_terminal_state().unwrap();
        $crate::term_utils::restore_terminal().unwrap();
        ctrlc::set_handler(|| {
            let _ = restore_terminal();
            std::process::exit(130);
        })
        .expect("Error setting Ctrl-C handler");

        let prev_hook = std::panic::take_hook();
        std::panic::set_hook(Box::new(move |panic_info| {
            let _ = restore_terminal();
            prev_hook(panic_info);
        }));
    };
}

pub fn initial_terminal_state() -> Result<()> {
    let mut stdout = stdout();
    enable_raw_mode()?;
    execute!(stdout, EnterAlternateScreen, Clear(ClearType::All), Hide)?;
    execute!(stdout, EnableMouseCapture)?;
    Ok(())
}

pub fn restore_terminal() -> Result<()> {
    let mut stdout = stdout();
    execute!(
        stdout,
        Clear(ClearType::All),
        Show,
        MoveTo(0, 0),
        LeaveAlternateScreen
    )?;
    execute!(stdout, DisableMouseCapture)?;
    disable_raw_mode()?;
    Ok(())
}