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 }
}