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
pub struct Args { args : std::env::Args, usage : String, } impl Args { pub fn new(usage : &str) -> Args { Args { args : std::env::args(), usage : usage.to_owned() } } pub fn badusage(&self, m : &str) -> ! { eprintln!("bad usage: {}\n{}\n", m, self.usage); std::process::exit(8); } pub fn parse_next<T : std::str::FromStr>(&mut self, what : &str) -> T where <T as std::str::FromStr>::Err: std::fmt::Debug { self.args .next().unwrap_or_else(|| self.badusage(&format!("missing {}",what))) .parse().unwrap_or_else(|e| self.badusage(&format!("bad {}: {:?}",what,e))) } } impl std::ops::Deref for Args { type Target = std::env::Args; fn deref(&self) -> &Self::Target { &self.args } } impl std::ops::DerefMut for Args { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.args } }