mod ui;
mod game;
use std::io;
use std::panic;
use anyhow::Result;
use crossterm::{
terminal::{self, EnterAlternateScreen, LeaveAlternateScreen},
event::{DisableMouseCapture, EnableMouseCapture},
execute,
};
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend;
use game::app::App;
fn main() -> Result<()> {
let original_hook = panic::take_hook();
panic::set_hook(Box::new(move |panic_info| {
let _ = restore_terminal();
original_hook(panic_info);
}));
initialize_terminal()?;
let mut app = App::new()?;
let mut terminal = Terminal::new(CrosstermBackend::new(io::stdout()))?;
let result = app.run(&mut terminal);
restore_terminal()?;
result
}
fn initialize_terminal() -> Result<()> {
terminal::enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
Ok(())
}
fn restore_terminal() -> Result<()> {
terminal::disable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, LeaveAlternateScreen, DisableMouseCapture)?;
Ok(())
}