pub mod app;
pub mod event;
pub mod handler;
pub mod render;
pub mod views;
pub mod widgets;
use anyhow::Result;
use crossterm::{
event::{DisableMouseCapture, EnableMouseCapture},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::prelude::*;
use crate::config::manager::ConfigManager;
use crate::model::loader::Models;
use self::app::App;
use self::event::{Event, EventLoop};
pub async fn run(models: Models, config_mgr: ConfigManager) -> Result<()> {
enable_raw_mode()?;
let mut stdout = std::io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
let mut app = App::new(models, config_mgr);
let event_loop = EventLoop::new(250);
let result = run_loop(&mut terminal, &mut app, &event_loop);
disable_raw_mode()?;
execute!(
terminal.backend_mut(),
LeaveAlternateScreen,
DisableMouseCapture
)?;
terminal.show_cursor()?;
result
}
fn run_loop(
terminal: &mut Terminal<CrosstermBackend<std::io::Stdout>>,
app: &mut App,
event_loop: &EventLoop,
) -> Result<()> {
loop {
terminal.draw(|frame| render::render(frame, app))?;
match event_loop.next()? {
Event::Key(key) => {
handler::handle_key(app, key);
}
Event::Tick | Event::Resize(_, _) => {}
}
if app.should_quit {
break;
}
}
Ok(())
}