pub mod app;
pub mod error_waterfall;
pub mod tabs;
use std::panic;
use anyhow::Context;
use crossterm::{
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{backend::CrosstermBackend, Terminal};
use sqlx::postgres::PgPoolOptions;
use app::{run_app, App};
pub async fn run(db_url: &str) -> anyhow::Result<()> {
let pool = PgPoolOptions::new()
.max_connections(5)
.connect(db_url)
.await
.context("Failed to connect to database")?;
let original_hook = panic::take_hook();
panic::set_hook(Box::new(move |info| {
let _ = disable_raw_mode();
let _ = execute!(std::io::stderr(), LeaveAlternateScreen);
original_hook(info);
}));
enable_raw_mode()?;
let mut stdout = std::io::stdout();
execute!(stdout, EnterAlternateScreen)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
terminal.clear()?;
error_waterfall::init_error_collector();
let app = App::new(pool);
let result = run_app(&mut terminal, app).await;
disable_raw_mode()?;
execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
terminal.show_cursor()?;
result
}