|
3 | 3 | extern crate cast;
|
4 | 4 | extern crate clap;
|
5 | 5 | extern crate either;
|
| 6 | +extern crate env_logger; |
6 | 7 | #[macro_use]
|
7 | 8 | extern crate error_chain;
|
8 | 9 | extern crate inflections;
|
9 | 10 | #[macro_use]
|
| 11 | +extern crate log; |
| 12 | +#[macro_use] |
10 | 13 | extern crate quote;
|
11 | 14 | extern crate svd_parser as svd;
|
12 | 15 | extern crate syn;
|
@@ -48,12 +51,25 @@ fn run() -> Result<()> {
|
48 | 51 | .long("nightly")
|
49 | 52 | .help("Enable features only available to nightly rustc"),
|
50 | 53 | )
|
| 54 | + .arg( |
| 55 | + Arg::with_name("log_level") |
| 56 | + .long("log") |
| 57 | + .short("l") |
| 58 | + .help(&format!( |
| 59 | + "Choose which messages to log (overrides {})", |
| 60 | + env_logger::DEFAULT_FILTER_ENV |
| 61 | + )) |
| 62 | + .takes_value(true) |
| 63 | + .possible_values(&["off", "error", "warn", "info", "debug", "trace"]) |
| 64 | + ) |
51 | 65 | .version(concat!(
|
52 | 66 | env!("CARGO_PKG_VERSION"),
|
53 | 67 | include_str!(concat!(env!("OUT_DIR"), "/commit-info.txt"))
|
54 | 68 | ))
|
55 | 69 | .get_matches();
|
56 | 70 |
|
| 71 | + setup_logging(&matches); |
| 72 | + |
57 | 73 | let target = matches
|
58 | 74 | .value_of("target")
|
59 | 75 | .map(|s| Target::parse(s))
|
@@ -93,21 +109,46 @@ fn run() -> Result<()> {
|
93 | 109 | Ok(())
|
94 | 110 | }
|
95 | 111 |
|
| 112 | +fn setup_logging(matches: &clap::ArgMatches) { |
| 113 | + // * Log at info by default. |
| 114 | + // * Allow users the option of setting complex logging filters using |
| 115 | + // env_logger's `RUST_LOG` environment variable. |
| 116 | + // * Override both of those if the logging level is set via the `--log` |
| 117 | + // command line argument. |
| 118 | + let env = env_logger::Env::default() |
| 119 | + .filter_or(env_logger::DEFAULT_FILTER_ENV, "info"); |
| 120 | + let mut builder = env_logger::Builder::from_env(env); |
| 121 | + builder.default_format_timestamp(false); |
| 122 | + |
| 123 | + let log_lvl_from_env = |
| 124 | + std::env::var_os(env_logger::DEFAULT_FILTER_ENV).is_some(); |
| 125 | + |
| 126 | + if log_lvl_from_env { |
| 127 | + log::set_max_level(log::LevelFilter::Trace); |
| 128 | + } else { |
| 129 | + let level = match matches.value_of("log_level") { |
| 130 | + Some(lvl) => lvl.parse().unwrap(), |
| 131 | + None => log::LevelFilter::Info, |
| 132 | + }; |
| 133 | + log::set_max_level(level); |
| 134 | + builder.filter_level(level); |
| 135 | + } |
| 136 | + |
| 137 | + builder.init(); |
| 138 | +} |
| 139 | + |
96 | 140 | fn main() {
|
97 | 141 | if let Err(ref e) = run() {
|
98 |
| - let stderr = io::stderr(); |
99 |
| - let mut stderr = stderr.lock(); |
100 |
| - |
101 |
| - writeln!(stderr, "error: {}", e).ok(); |
| 142 | + error!("{}", e); |
102 | 143 |
|
103 | 144 | for e in e.iter().skip(1) {
|
104 |
| - writeln!(stderr, "caused by: {}", e).ok(); |
| 145 | + error!("caused by: {}", e); |
105 | 146 | }
|
106 | 147 |
|
107 | 148 | if let Some(backtrace) = e.backtrace() {
|
108 |
| - writeln!(stderr, "backtrace: {:?}", backtrace).ok(); |
| 149 | + error!("backtrace: {:?}", backtrace); |
109 | 150 | } else {
|
110 |
| - writeln!(stderr, "note: run with `RUST_BACKTRACE=1` for a backtrace").ok(); |
| 151 | + error!("note: run with `RUST_BACKTRACE=1` for a backtrace") |
111 | 152 | }
|
112 | 153 |
|
113 | 154 | process::exit(1);
|
|
0 commit comments