qsv_docopt 1.10.0

Command line argument parsing.
Documentation
use crate::{Docopt, Error};

fn get_suggestion(doc: &str, argv: &[&'static str]) -> Error {
    let dopt = match Docopt::new(doc) {
        Err(err) => panic!("Invalid usage: {}", err),
        Ok(dopt) => dopt,
    };
    let mut argv: Vec<_> = argv.iter().map(|x| x.to_string()).collect();
    argv.insert(0, "prog".to_string());
    match dopt.argv(argv).parse() {
        Err(err) => err,
        Ok(_) => panic!("Should have been a user error"),
    }
}

macro_rules! test_suggest(
    ($name:ident, $doc:expr, $args:expr, $expected:expr) => (
        #[test]
        fn $name() {
            let sg = get_suggestion($doc, $args);
            println!("{}", sg);
            match sg {
                Error::WithProgramUsage(e, _) => {
                    match *e {
                        Error::Argv(msg) => {
                            println!("{:?}",msg);
                            assert_eq!(msg, $expected);
                        }
                        err => panic!("Error other than argv: {:?}", err)
                    }
                },
                _ => panic!("Error without program usage")
            }
        }
    );
);

test_suggest!(
    test_suggest_1,
    "Usage: prog [--release]",
    &["--releas"],
    "Unknown flag: '--releas'. Did you mean '--release'?"
);

test_suggest!(
    test_suggest_2,
    "Usage: prog [-a] <source> <dest>
        prog [-a] <source>... <dir>
        prog [-e]
 Options:
    -a, --archive  Copy everything.
",
    &["-d"],
    "Unknown flag: '-d'"
);

test_suggest!(
    test_suggest_3,
    "Usage: prog [-a] <source> <dest>
        prog [-a] <source>... <dir>
        prog [-e]
 Options:
    -a, --archive  Copy everything.
    -e, --export Export all the things.
",
    &["--expotr"],
    "Unknown flag: '--expotr'. Did you mean '--export'?"
);

test_suggest!(
    test_suggest_4,
    "Usage: prog [--import] [--complete]
",
    &["--mport", "--complte"],
    "Unknown flag: '--mport'. Did you mean '--import'?"
);

test_suggest!(
    test_suggest_5,
    "Usage: prog [--import] [--complete]
",
    &["--import", "--complte"],
    "Unknown flag: '--complte'. Did you mean '--complete'?"
);