use std::io;
use crossterm::event::{self, Event, KeyEventKind};
use ratatui::widgets::Widget;
use super::app::{App, AppResult, UpdateResult};
use super::backend::InlineTerminal;
pub fn run(mut app: App) -> io::Result<Option<AppResult>> {
let height = app.terminal_height();
let mut term = InlineTerminal::new(height)?;
loop {
let new_height = app.terminal_height();
if new_height != term.height() {
tracing::trace!(old_height = term.height(), new_height, "resize viewport");
term.resize(new_height)?;
}
term.terminal().draw(|frame| {
let area = frame.area();
(&app).render(area, frame.buffer_mut());
if let Some((x, y)) = app.cursor_position(area) {
frame.set_cursor_position((x, y));
}
})?;
if let Event::Key(key) = event::read()? {
if key.kind != KeyEventKind::Press {
tracing::trace!(?key, "ignored non-press key event");
continue;
}
let result = app.update(key);
tracing::trace!(?key, ?result, "handled key event");
match result {
UpdateResult::Continue => {}
UpdateResult::Done => return Ok(app.extract_result()),
UpdateResult::Cancelled => return Ok(None),
}
}
}
}