larpa 0.1.1

Lousy ARgument PArser
Documentation
use expect_test::expect;

use crate::{
    Command, Context,
    tests::check_err,
    types::{PrintVersion, Verbosity},
};

#[test]
fn custom_version() {
    #[derive(Command)]
    #[larpa(crate = "crate", version = concat!("custom-version", "-1.0"))]
    struct MyCmd {}

    assert_eq!(MyCmd::DESC.version(), Some("custom-version-1.0"));
}

#[test]
fn print_version() {
    #[derive(Command)]
    #[larpa(crate = "crate", name = "mycmd", version = concat!("custom-version", "-1.0"))]
    struct MyCmd {
        #[larpa(flag, name = "--version")]
        _version: PrintVersion,
    }

    let error = MyCmd::try_from_iter(["mycmd", "--version"]).err().unwrap();
    expect![[r#"
        mycmd custom-version-1.0
    "#]]
    .assert_eq(&error.to_string());

    check_err::<MyCmd>(
        ["mycmd", "--invalid"],
        expect![[r#"
            <red>error</red>: unexpected argument `--invalid`

            <b>usage</b>: <b>mycmd</b> [--version] [--help]
        "#]],
    );
}

#[test]
fn custom_formatter() {
    #[allow(dead_code)]
    #[derive(Debug, Command)]
    #[larpa(crate = "crate", version = "1.2.3", version_formatter = "my_fmt")]
    struct MyCmd {
        #[larpa(flag, name = "--version")]
        version: PrintVersion,

        #[larpa(flag, name = ["-v", "--verbose"])]
        verbosity: Verbosity,
    }

    fn my_fmt(cx: &Context) -> String {
        let version = cx.command_desc().version().unwrap();
        if cx.verbosity() > 0 {
            format!("MY-CMD {version}\nverbose info\n")
        } else {
            format!("MY-CMD {version}")
        }
    }

    check_err::<MyCmd>(
        ["my-cmd", "--version"],
        expect![[r#"
            MY-CMD 1.2.3
        "#]],
    );

    check_err::<MyCmd>(
        ["my-cmd", "--version", "-v"],
        expect![[r#"
            MY-CMD 1.2.3
            verbose info
        "#]],
    );
}