mod actions; mod app; mod gentoo; mod screens; mod theme; mod widgets; use std::{ io::{self, Stdout, stdout}, panic::{set_hook, take_hook}, }; use ratatui::{ Terminal, crossterm::{ execute, terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}, }, prelude::CrosstermBackend, }; use crate::{ app::App, gentoo::{Portage, portage_loader}, }; struct TuiGuard; impl Drop for TuiGuard { fn drop(&mut self) { _ = restore_tui(); } } fn main() -> color_eyre::Result<()> { color_eyre::install()?; let _guard = TuiGuard; let tui = init_tui()?; let mut p = Portage::new(); p.world_packages = portage_loader::load_world_packages()?; p.installed_packages = portage_loader::load_installed_packages()?; // p.available_packages = portage_loader::load_available_packages()?; let mut app = App::new(p); run(tui, &mut app)?; Ok(()) } fn run(mut terminal: Terminal>, app: &mut App) -> color_eyre::Result<()> { loop { terminal.draw(|frame| app.draw(frame))?; let should_exit = app.update()?; if should_exit { break; } } Ok(()) } fn init_tui() -> io::Result>> { execute!(stdout(), EnterAlternateScreen)?; enable_raw_mode()?; init_panic_hook(); 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(()) }