use std::{io, path::Path}; use color_eyre::Result; use crossterm::{ execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }; use ratatui::{prelude::CrosstermBackend, Terminal}; use crate::app::App; mod app; mod event; mod form; mod manifest; mod ui; #[tokio::main] async fn main() -> Result<()> { enable_raw_mode()?; let mut stdout = io::stdout(); execute!(stdout, EnterAlternateScreen)?; let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; // Set up panic hook to restore terminal let original_hook = std::panic::take_hook(); std::panic::set_hook(Box::new(move |panic| { let _ = disable_raw_mode(); let _ = execute!(io::stdout(), LeaveAlternateScreen); original_hook(panic); })); // Run the app let result = App::new().run(&mut terminal).await; // Restore terminal disable_raw_mode()?; execute!(terminal.backend_mut(), LeaveAlternateScreen)?; result }