use std::{error::Error, io, time::Duration}; use ratatui::{ Terminal, backend::{Backend, CrosstermBackend}, crossterm::{ event::{self, DisableMouseCapture, EnableMouseCapture, Event}, execute, terminal::{ EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, }, }, }; use crate::{app::App, ui}; pub fn run(app: App) -> Result<(), Box> { // setup terminal enable_raw_mode()?; let mut stdout = io::stdout(); execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; // create app and run it let app_result = run_app(&mut terminal, app); // restore terminal disable_raw_mode()?; execute!( terminal.backend_mut(), LeaveAlternateScreen, DisableMouseCapture )?; terminal.show_cursor()?; if let Err(err) = app_result { println!("{err:?}"); } Ok(()) } // TODO: Implement save on quit fn run_app( terminal: &mut Terminal, mut app: App, ) -> io::Result<()> where io::Error: From, { loop { terminal.draw(|frame| ui::draw(frame, &mut app))?; if event::poll(Duration::from_millis(10))? { if let Event::Key(key) = event::read()? { app.handle_key(key.code); } } if app.should_quit { return Ok(()); } } } // pub fn run_app( // terminal: &mut Terminal, // mut app: App, // ) -> io::Result // where // io::Error: From, // { // loop { // terminal.draw(|f| ui(f, &app))?; // // if let Event::Key(key) = event::read()? { // app.handle_key(key.code); // if app.should_quit { // return Ok(app); // } // } // } // }