1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
use std::env; use getopts; use commands; struct CLI { options: getopts::Options, help: String } impl CLI { pub fn new() -> CLI { let mut options = getopts::Options::new(); options.optflag("h", "help", "output usage information"); options.optflag("v", "version", "output the version number"); options.optopt("d", "delete", "delete the specified key", "KEY"); let help = options.usage("Usage: rump [OPTIONS] [KEY] [VALUE]"); CLI { options: options, help: help } } pub fn run(&self, args: &[String]) -> Result<Option<String>, getopts::Fail> { let parsed_options = try!(self.options.parse(args)); if parsed_options.opt_present("help") { return Ok(Some(self.help.clone())); } else if parsed_options.opt_present("version") { return Ok(Some(commands::version())); } else if parsed_options.opt_present("delete") { match parsed_options.opt_str("delete") { Some(key) => { commands::delete(&key[..]); return Ok(None); }, None => return Ok(Some("Cannot delete without a key.".to_string())), } } match parsed_options.free.len() { 2 => { commands::set(&parsed_options.free[0], &parsed_options.free[1]); Ok(None) }, 1 => { match commands::get(&parsed_options.free[0]) { Some(value) => Ok(Some(value)), None => Ok(None), } }, _ => Ok(Some(self.help.clone())), } } } pub fn run() -> Result<(), getopts::Fail> { let args: Vec<String> = env::args().skip(1).collect(); let program = CLI::new(); match program.run(&args) { Ok(option) => { if option.is_some() { println!("{}", option.unwrap()); } Ok(()) }, Err(error) => Err(error), } }