aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs73
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(())
+}