diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..55e721a --- /dev/null +++ b/src/main.rs @@ -0,0 +1,73 @@ +mod app; +mod event; +mod gentoo; +mod ui; + +use std::{ + io::{self, Stdout, stdout}, + panic::{set_hook, take_hook}, +}; + +use ratatui::{ + Terminal, + backend::Backend, + crossterm::{ + execute, + terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}, + }, + prelude::CrosstermBackend, +}; + +use crate::{app::App, event::handle_event, gentoo::Portage, ui::ui}; + +fn main() -> color_eyre::Result<()> { + color_eyre::install()?; + init_panic_hook(); + let mut tui = init_tui()?; + + let mut p = Portage::new(); + p.load_installed_packages()?; + + let mut app = App::new(p); + + run(&mut tui, &mut app)?; + + restore_tui()?; + + Ok(()) +} + +fn run<B: Backend>(terminal: &mut Terminal<B>, app: &mut App) -> io::Result<()> +where + io::Error: From<B::Error>, +{ + loop { + terminal.draw(|frame| ui(frame, app))?; + let should_exit = handle_event(app)?; + if should_exit { + break; + } + } + + Ok(()) +} + +fn init_tui() -> io::Result<ratatui::Terminal<CrosstermBackend<Stdout>>> { + enable_raw_mode()?; + execute!(stdout(), EnterAlternateScreen)?; + Terminal::new(CrosstermBackend::new(stdout())) +} + +fn init_panic_hook() { + let original_hook = take_hook(); + set_hook(Box::new(move |panic_info| { + let _ = restore_tui(); + original_hook(panic_info); + })); +} + +fn restore_tui() -> io::Result<()> { + disable_raw_mode()?; + execute!(stdout(), LeaveAlternateScreen)?; + Ok(()) +} |
