47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
mod game;
|
|
mod geometry;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use color_eyre::eyre::Result;
|
|
use crossterm::{event::{self, DisableMouseCapture, EnableMouseCapture}, execute, terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}};
|
|
use ratatui::{
|
|
Terminal,
|
|
prelude::{Backend, CrosstermBackend},
|
|
};
|
|
|
|
use game::GameModel;
|
|
|
|
fn main() -> Result<()> {
|
|
enable_raw_mode()?;
|
|
execute!(std::io::stderr(), EnterAlternateScreen, EnableMouseCapture)?;
|
|
|
|
let mut terminal = Terminal::new(CrosstermBackend::new(std::io::stderr()))?;
|
|
let result = main_loop(&mut terminal);
|
|
|
|
disable_raw_mode()?;
|
|
execute!(
|
|
terminal.backend_mut(),
|
|
LeaveAlternateScreen,
|
|
DisableMouseCapture
|
|
)?;
|
|
terminal.show_cursor()?;
|
|
|
|
let path = result?;
|
|
println!("{}", path.display());
|
|
Ok(())
|
|
}
|
|
|
|
fn main_loop<T: Backend>(terminal: &mut Terminal<T>) -> Result<PathBuf> {
|
|
let mut model = GameModel::new(PathBuf::from("."));
|
|
loop {
|
|
terminal.draw(|frame| model.render(frame))?;
|
|
|
|
let term_event = event::read()?;
|
|
match model.update(term_event) {
|
|
Ok(new_model) => model = new_model,
|
|
Err(path) => break Ok(path),
|
|
}
|
|
}
|
|
}
|