docopt 0.6.78

Command line argument parsing.
Documentation
use {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.into_iter()).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'?");