mod db; mod deck; mod gui; mod model; mod space_repetition; mod sync; mod util; use anyhow::Result; use clap::Parser; use std::path::PathBuf; #[derive(Parser)] #[clap()] struct Opt { /// Path to the deck #[clap(long, default_value = "deck.deck")] deck: String, /// Hide remaining card counts #[clap(long)] hide_remaining: bool, } fn main() -> Result<()> { let args = Opt::parse(); let deck_path = args.deck; let mut conn = db::init(db_path(&deck_path))?; let deck_name = deck::pp_from_path(&deck_path).unwrap_or_else(|| "Deck".to_string()); sync::run(&mut conn, &deck_path)?; let deck_last_sync = util::time::seconds_since_unix_epoch()?; let mut term = gui::setup_terminal()?; match gui::start( &mut conn, &mut term, &deck_path, &deck_name, deck_last_sync, args.hide_remaining, ) { Ok(()) => (), Err(msg) => { // Show errors in TUI, otherwise they are hidden gui::message::show(&mut term, &deck_name, &format!("{msg}"), true)? } } gui::restore_terminal(&mut term) } fn db_path(deck_path: &str) -> String { let mut path = PathBuf::from(deck_path); path.set_extension("db"); path.to_string_lossy().to_string() }