lr2-oxytabler 0.10.2

Table manager for Lunatic Rave 2
Documentation
use anyhow::{Result, ensure};
use lr2_oxytabler::output::OutputFolder;
use std::path::PathBuf;

mod cli_update;

fn main() -> Result<()> {
    const HELP: &str = concat!(
        env!("CARGO_PKG_NAME"),
        " ",
        env!("CARGO_PKG_VERSION"),
        "
Usage:
  update:
    --db <path>                Path to song.db
    --output <key:path>        Folders to write playlists to (multiple allowed)
    --write-tags <true/false>  Enable or disable tag writing (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") {
        println!("{HELP}");
        return Ok(());
    }

    match args.subcommand()?.as_deref() {
        Some("update") => {
            let db = args.value_from_str::<_, PathBuf>("--db")?;
            let outputs = fixup_outputs(args.values_from_str::<_, OutputFolder>("--output")?);
            let write_tags = args
                .opt_value_from_str::<_, bool>("--write-tags")?
                .unwrap_or(false);
            let left = args.finish();
            ensure!(left.is_empty(), "Unsupported arguments: {left:?}");
            cli_update::run(&db, &outputs, write_tags)
        }
        Some(cmd) => anyhow::bail!("invalid cmd: {cmd}"),
        None => {
            let left = args.finish();
            ensure!(left.is_empty(), "Unsupported arguments: {left:?}");
            log::warn!("hint: see --help:\n\n{HELP}");
            anyhow::bail!("nothing to do")
        }
    }
}