use anyhow::{Context, Result, anyhow};
use diesel::Connection;
use diesel::sqlite::SqliteConnection;
use diesel_async::sync_connection_wrapper::SyncConnectionWrapper;
use diesel_migrations::{EmbeddedMigrations, MigrationHarness, embed_migrations};
use chloe_todo_tui::{
app::App,
database::{TodoRepository, get_xdg_sqlite_path},
tui,
};
const MIGRATIONS: EmbeddedMigrations = embed_migrations!("./migrations");
#[tokio::main]
async fn main() -> Result<()> {
color_eyre::install().expect("install color-eyre");
let db_path = get_xdg_sqlite_path(env!("CARGO_PKG_NAME")).await?;
let db_path_string = db_path.to_string_lossy().into_owned();
let mut raw_conn = SqliteConnection::establish(&db_path_string)
.with_context(|| format!("failed to open sqlite database at {db_path_string}"))?;
run_migrations(&mut raw_conn)?;
let conn = SyncConnectionWrapper::new(raw_conn);
let repo = TodoRepository::new(conn);
let initial_todos = repo.list_all().await?;
let app = App::with_todos(initial_todos);
let mut terminal = tui::init_terminal()?;
let result = tui::run_app(&mut terminal, app, repo).await;
tui::restore_terminal(&mut terminal)?;
result?;
Ok(())
}
fn run_migrations(conn: &mut SqliteConnection) -> Result<()> {
conn.run_pending_migrations(MIGRATIONS)
.map_err(|err| anyhow!("failed to run database migrations: {err}"))?;
Ok(())
}