mod app;
mod data;
mod screens;
mod theme;
use std::time::Duration;
use anyhow::Result;
use ratatui::DefaultTerminal;
use ratatui::crossterm::event::{self, Event, KeyEventKind};
use app::App;
use data::FsCatalog;
pub fn run() -> Result<()> {
let catalog = FsCatalog::new()?;
let mut app = App::new(catalog);
install_panic_hook();
let mut terminal = ratatui::init();
let result = event_loop(&mut terminal, &mut app);
ratatui::restore();
result
}
fn event_loop(terminal: &mut DefaultTerminal, app: &mut App<FsCatalog>) -> Result<()> {
while !app.should_quit {
app.refresh_active();
terminal.draw(|frame| screens::render(frame, app))?;
if event::poll(Duration::from_millis(250))?
&& let Event::Key(key) = event::read()?
&& key.kind == KeyEventKind::Press
{
app.on_key(key);
}
}
Ok(())
}
fn install_panic_hook() {
let previous = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
ratatui::restore();
previous(info);
}));
}