1use ::converter;
2
3use std::io;
4use std::env;
5use getopts::Options;
6use atty::{self, Stream};
7
8fn print_usage(program: &str, opts: Options) {
9 let brief = format!(
10r#"Usage:
11 $ {} <number>
12 $ echo <number> | {}"#, program, program);
13 print!("{}", opts.usage(&brief));
14}
15
16fn print_version() {
17 println!("{}", env!("CARGO_PKG_VERSION"));
18}
19
20pub fn run(args: env::Args) -> () {
21 let num: f64 = if atty::is(Stream::Stdin) {
22 let args: Vec<String> = args.collect();
23 let ref program = args[0];
24
25 let mut opts = Options::new();
26 opts.optflag("h", "help", "print this help menu");
27 opts.optflag("v", "version", "print version");
28
29 let matches = match opts.parse(&args[1..]) {
30 Ok(m) => { m }
31 Err(f) => { panic!(f.to_string()) }
32 };
33
34 if matches.opt_present("v") {
35 return print_version();
36 } else if matches.opt_present("h") || args.len() != 2 {
37 return print_usage(&program, opts);
38 }
39
40 match args[1].parse::<f64>() {
41 Ok(n) => n,
42 Err(f) => { panic!(f.to_string()) }
43 }
44 } else {
45 let mut input = String::new();
46 io::stdin().read_line(&mut input).ok().expect("Unable to read from console!");
47 input.trim().parse::<f64>().unwrap()
48 };
49
50 println!("{}", converter::convert(num));
51}