lr2-oxytabler 0.10.2

Table manager for Lunatic Rave 2
Documentation
// Windows: don't spawn a console.
#![cfg_attr(not(test), windows_subsystem = "windows")]

use anyhow::{Result, ensure};
use lr2_oxytabler::output::OutputFolder;
use std::path::PathBuf;

mod gui;
mod gui_dummy;

fn main() -> Result<()> {
    const HELP: &str = concat!(env!("CARGO_PKG_NAME"), " ", env!("CARGO_PKG_VERSION"), "
Usage:
    --db <path>                           Path to song.db
    --output <key:path>                   Folders to write playlists to (multiple allowed)
    --save-on-update-finish <true/false>  Enable or disable saving on update completion (default: 'true')
    --write-tags <true/false>             Enable or disable writing tags (default: 'false')

Environment variables:
    RUST_LOG - configure logging");

    fn fixup_outputs(mut outputs: Vec<OutputFolder>) -> Vec<OutputFolder> {
        // Only keep the last output path specified for key.
        outputs.reverse();
        outputs.sort_by(|a, b| a.0.0.cmp(&b.0.0)); // stable sort
        outputs.dedup_by(|a, b| a.0.0 == b.0.0);
        outputs
    }

    env_logger::Builder::from_env(
        env_logger::Env::default().default_filter_or("lr2_oxytabler=info"),
    )
    .init();

    let mut args = pico_args::Arguments::from_env();

    if args.contains("--help") {
        return gui_dummy::run(HELP.to_string());
    }

    let app = (|| {
        let db = args.value_from_str::<_, PathBuf>("--db")?;
        let outputs = fixup_outputs(args.values_from_str::<_, OutputFolder>("--output")?);
        let write_tags_on_save = args
            .opt_value_from_str::<_, bool>("--write-tags")?
            .unwrap_or(false);
        let save_on_update_finish = args
            .opt_value_from_str::<_, bool>("--save-on-update-finish")?
            .unwrap_or(true);
        let left = args.finish();
        ensure!(left.is_empty(), "Unsupported arguments: {left:?}");
        gui::App::new(&db, outputs, save_on_update_finish, write_tags_on_save)
    })();

    match app {
        Ok(app) => app.run(),
        Err(e) => {
            let e = format!(
                "An error occurred while starting LR2 OxyTabler:\n{e:#}\n\nHINT: see --help:\n{HELP}"
            );
            log::error!("{e}");
            gui_dummy::run(e)
        }
    }
}