mod events;
#[macro_use]
mod traits;
pub mod app;
mod impls;
mod theme;
use std::sync::{
atomic::{AtomicBool, Ordering},
mpsc, Arc,
};
use app::App;
pub use events::Event;
pub async fn run(args: Vec<String>) -> crate::Result<()> {
let (event_tr, event_rc) = mpsc::channel::<Event>();
let shutdown = Arc::new(AtomicBool::new(false));
let mut terminal = ratatui::init();
let mut app = App::new()?;
app.cli_args(args)?;
app.init_threads(&event_tr, &shutdown);
while !app.exit {
let area = app.draw(&mut terminal)?;
let result = app
.handle_event(event_rc.recv()?, area, &event_tr, &shutdown)
.await;
if let Err(e) = result {
app.fatal_error_popup.set_text(e.to_string());
}
}
app.draw(&mut terminal)?;
shutdown.store(true, Ordering::Relaxed);
app.exit_threads().await;
ratatui::restore();
Ok(())
}