pretty_bytes/
cli.rs

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}