pretty-exec 0.0.35

Print a command and then execute it
Documentation
use pipe_trait::*;
use pretty_exec::{args::Args, clap::Shell, structopt::StructOpt};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct CargoManifest {
    pub package: CargoPackage,
}

#[derive(Debug, Serialize, Deserialize)]
struct CargoPackage {
    pub version: String,
}

#[derive(Debug, Serialize, Deserialize)]
struct SyncJson {
    pub version: String,
}

macro_rules! test_version {
    ($name:ident, $path:literal) => {
        #[test]
        fn $name() {
            let json_version = include_str!("../../../sync.json")
                .pipe(serde_json::from_str::<SyncJson>)
                .pipe(Result::unwrap)
                .pipe(|x: SyncJson| x.version);
            let toml_version = include_str!($path)
                .pipe(toml::from_str::<CargoManifest>)
                .pipe(Result::unwrap)
                .pipe(|x: CargoManifest| x.package.version);
            assert_eq!(toml_version, json_version);
        }
    };
}

test_version!(bin_version, "../Cargo.toml");
test_version!(lib_version, "../../pretty-exec-lib/Cargo.toml");

macro_rules! test_completion {
    ($test_name:ident, $shell:expr, $path:literal) => {
        #[test]
        fn $test_name() {
            let expected: &[u8] = include_bytes!($path);
            let mut actual = Vec::new();
            Args::clap().gen_completions_to("pretty-exec", $shell, &mut actual);
            let actual = actual.as_slice();
            assert_eq!(actual, expected);
        }
    };
}

test_completion!(
    bash_completion,
    Shell::Bash,
    "../../../exports/completion.bash"
);
test_completion!(
    fish_completion,
    Shell::Fish,
    "../../../exports/completion.fish"
);
test_completion!(
    zsh_completion,
    Shell::Zsh,
    "../../../exports/completion.zsh"
);
test_completion!(
    powershell_completion,
    Shell::PowerShell,
    "../../../exports/completion.ps1"
);
test_completion!(
    elvish_completion,
    Shell::Elvish,
    "../../../exports/completion.elv"
);