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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
pub struct HelpText<'a> { pub name: &'a str, pub version: &'a str, pub syntax: &'a str, pub summary: &'a str, pub long_help: &'a str, pub display_usage: bool, } pub struct CoreOptions<'a> { options: getopts::Options, help_text: HelpText<'a>, } impl<'a> CoreOptions<'a> { pub fn new(help_text: HelpText<'a>) -> Self { let mut ret = CoreOptions { options: getopts::Options::new(), help_text, }; ret.options .optflag("", "help", "print usage information") .optflag("", "version", "print name and version number"); ret } pub fn optflagopt( &mut self, short_name: &str, long_name: &str, desc: &str, hint: &str, ) -> &mut CoreOptions<'a> { self.options.optflagopt(short_name, long_name, desc, hint); self } pub fn optflag( &mut self, short_name: &str, long_name: &str, desc: &str, ) -> &mut CoreOptions<'a> { self.options.optflag(short_name, long_name, desc); self } pub fn optflagmulti( &mut self, short_name: &str, long_name: &str, desc: &str, ) -> &mut CoreOptions<'a> { self.options.optflagmulti(short_name, long_name, desc); self } pub fn optopt( &mut self, short_name: &str, long_name: &str, desc: &str, hint: &str, ) -> &mut CoreOptions<'a> { self.options.optopt(short_name, long_name, desc, hint); self } pub fn optmulti( &mut self, short_name: &str, long_name: &str, desc: &str, hint: &str, ) -> &mut CoreOptions<'a> { self.options.optmulti(short_name, long_name, desc, hint); self } pub fn usage(&self, summary: &str) -> String { self.options.usage(summary) } pub fn parse(&mut self, args: Vec<String>) -> getopts::Matches { let matches = match self.options.parse(&args[1..]) { Ok(m) => Some(m), Err(f) => { eprint!("{}: error: ", self.help_text.name); eprintln!("{}", f); ::std::process::exit(1); } } .unwrap(); if matches.opt_present("help") { let usage_str = if self.help_text.display_usage { format!( "\n {}\n\n Reference\n", self.options.usage(self.help_text.summary) ) .replace("Options:", " Options:") } else { String::new() }; print!( " {0} {1} {0} {2} {3}{4} ", self.help_text.name, self.help_text.version, self.help_text.syntax, usage_str, self.help_text.long_help ); crate::exit!(0); } else if matches.opt_present("version") { println!("{} {}", self.help_text.name, self.help_text.version); crate::exit!(0); } matches } } #[macro_export] macro_rules! app { ($syntax: expr, $summary: expr, $long_help: expr) => { uucore::coreopts::CoreOptions::new(uucore::coreopts::HelpText { name: executable!(), version: env!("CARGO_PKG_VERSION"), syntax: $syntax, summary: $summary, long_help: $long_help, display_usage: true, }) }; ($syntax: expr, $summary: expr, $long_help: expr, $display_usage: expr) => { uucore::coreopts::CoreOptions::new(uucore::coreopts::HelpText { name: executable!(), version: env!("CARGO_PKG_VERSION"), syntax: $syntax, summary: $summary, long_help: $long_help, display_usage: $display_usage, }) }; }