chloe_todo_tui 0.1.0

A terminal-based todo application with TUI
Documentation
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(())
}