diff --git a/Cargo.toml b/Cargo.toml index 7d0e57261..c8b88d770 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ flexi_logger = "0.6.8" gdk-pixbuf = "0.2.0" gdk-pixbuf-sys = "0.4.0" gdk-sys = "0.4.0" +getopts = "0.2.15" gio = "0.2.0" glib = "0.3.1" glib-sys = "0.4.0" diff --git a/src/bin.rs b/src/bin.rs index d191d68af..6d9cf671c 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -1,22 +1,66 @@ #![feature(alloc_system)] extern crate alloc_system; +extern crate getopts; extern crate pnmixerlib; use pnmixerlib::*; use app_state::*; +use getopts::Options; use std::rc::Rc; +use std::env; fn main() { - gtk::init().unwrap(); + let args: Vec = env::args().collect(); - flexi_logger::LogOptions::new() - .log_to_file(false) - // ... your configuration options go here ... - .init(Some("pnmixer=debug".to_string())) - .unwrap_or_else(|e| panic!("Logger initialization failed with {}", e)); + let mut opts = Options::new(); + opts.optflag("h", "help", "Show help"); + opts.optopt("", "log-to-file", + "Log files to the specified dir instead of stderr", + "DIRECTORY"); + opts.optflagopt("l", "log-level", + "Set the log level (trace/debug/info/warn/error/off)", + "LEVEL"); + + let matches = match opts.parse(&args[1..]) { + Ok(m) => { m } + Err(f) => { panic!(f.to_string()) } + }; + + if matches.opt_present("h") { + print_usage(opts); + return; + } + + let log_dir = matches.opt_str("log-to-file"); + let log_level = matches.opt_default("log-level", "debug").map(|s| { + match s.to_lowercase().as_str() { + "trace" => flexi_logger::LogLevelFilter::Trace, + "debug" => flexi_logger::LogLevelFilter::Debug, + "info" => flexi_logger::LogLevelFilter::Info, + "warn" => flexi_logger::LogLevelFilter::Warn, + "error" => flexi_logger::LogLevelFilter::Error, + "off" => flexi_logger::LogLevelFilter::Off, + _ => flexi_logger::LogLevelFilter::Debug, + } + }).unwrap_or(flexi_logger::LogLevelFilter::Off); + + let mut flogger = flexi_logger::Logger::with( + flexi_logger::LogSpecification::default(log_level).build()); + + if let Some(dir) = log_dir { + flogger = flogger.log_to_file().directory(dir); + } + + flogger + .start() + .unwrap_or_else(|e|{panic!("Logger initialization failed with {}",e)}); + + + gtk::init() + .unwrap_or_else(|e| panic!("Gtk initialization failed with {}", e)); let apps = Rc::new(new_alsa_appstate()); @@ -26,3 +70,9 @@ fn main() { // TODO: clean deallocation? } + + +fn print_usage(opts: Options) { + let brief = format!("Usage: pnmixer-rs [options]"); + print!("{}", opts.usage(&brief)); +}