diff options
author | Zachary Dremann <dremann@gmail.com> | 2014-06-17 11:48:59 -0400 |
---|---|---|
committer | Zachary Dremann <dremann@gmail.com> | 2014-06-17 11:48:59 -0400 |
commit | b4ad79cfa0170e4b24936bdee2fd4ab9db6bf682 (patch) | |
tree | 65748f2873ad10638d45c3860f8ed55c5cc512dc | |
parent | ec98be668549d11e09cafd833dd009351188327d (diff) | |
download | rusty-irc-b4ad79cfa0170e4b24936bdee2fd4ab9db6bf682.tar.gz rusty-irc-b4ad79cfa0170e4b24936bdee2fd4ab9db6bf682.zip |
Add usage text to rusti
-rw-r--r-- | examples/rusti.rs | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/examples/rusti.rs b/examples/rusti.rs index ba1f4e1..91d50dd 100644 --- a/examples/rusti.rs +++ b/examples/rusti.rs @@ -5,31 +5,50 @@ extern crate libc; use std::os; use std::io; -use getopts::{getopts, opt, optflag, optflagmulti, optmulti, optopt, reqopt, usage}; +use getopts::{getopts, opt, optflag, optflagmulti, optmulti, optopt, reqopt, short_usage, usage}; -fn err(code: i32, err_msg: &str) -> ! { - let mut stderr = io::stderr(); - writeln!(stderr, "{}", err_msg); - unsafe{ libc::exit(code) } +struct ShowableTraitObject<'a>(&'a std::fmt::Show); + +impl<'a> std::fmt::Show for ShowableTraitObject<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + let &ShowableTraitObject(inner) = self; + inner.fmt(f) + } } fn main() { + let opts = [ + optflag("h", "help", "Print help information"), optmulti("c", "channel", "What channel should be joined", "CHANNEL"), - optflag("", "ignore-privmsg", "Ignore messages sent directly, only respond to those in a joinned channel"), optopt("p", "port", "What port should be used to connect to server", "PORT"), + optflag("", "ignore-privmsg", "Ignore messages sent directly, only respond to those in a joinned channel"), ]; - let mut stderr = io::stderr(); - let mut args = os::args(); + let args = os::args(); let program = args.get(0); + + let err: |i32, &std::fmt::Show| -> ! = |code: i32, err_msg: &std::fmt::Show| { + let mut stderr = io::stderr(); + let _ = writeln!(stderr, "{}", ShowableTraitObject(err_msg)); + let short = short_usage(program.as_slice(), opts); + let _ = writeln!(stderr, "{}", usage(short.as_slice(), opts)); + unsafe{ libc::exit(code) } + }; + let matches = match getopts(args.tail(), opts) { Ok(m) => { m } - Err(e) => { err(1, e.to_err_msg().as_slice()); } + Err(e) => { err(1, &e); } }; + if matches.opt_present("help") { + let short = short_usage(program.as_slice(), opts); + println!("{}", usage(short.as_slice(), opts)); + return; + } + let channels = matches.opt_strs("channel"); let port: u16 = from_str(matches.opt_str("port").unwrap_or("6667".to_string()).as_slice()).expect("Please pass a port number to -p or --port"); let ignore_privmsg = matches.opt_present("ignore-privmsg"); - let server = if matches.free.len() != 1 { err(2, "No server passed") } else { matches.free.move_iter().next().unwrap() }; + let server = if matches.free.len() != 1 { err(2, &"No server passed") } else { matches.free.move_iter().next().unwrap() }; println!("server:{}, channels:{}, port:{}, ignore?:{}", server, channels, port, ignore_privmsg); } |