Skip to content

Commit 5bd8d47

Browse files
committed
Introduce a logging system.
svd2rust now uses env_logger instead of printing directly to stderr. env_logger is currently configured to log messages >= info to stderr.
1 parent 08c8d07 commit 5bd8d47

File tree

3 files changed

+56
-13
lines changed

3 files changed

+56
-13
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ path = "src/main.rs"
3131
cast = "0.2.2"
3232
clap = "2.26.0"
3333
either = "1.0.3"
34+
env_logger = "~0.5"
3435
error-chain = "0.11.0"
3536
inflections = "1.1.0"
37+
log = { version = "~0.4", features = ["std"] }
3638
quote = "0.3.15"
3739
svd-parser = "0.6"
3840
syn = "0.11.11"

src/generate/peripheral.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,8 @@ impl FieldRegions {
341341
r.fields.len() > 1 && (idents.iter().filter(|ident| **ident == r.ident).count() > 1)
342342
})
343343
.inspect(|r| {
344-
eprintln!(
345-
"WARNING: Found type name conflict with region {:?}, renamed to {:?}",
344+
warn!(
345+
"Found type name conflict with region {:?}, renamed to {:?}",
346346
r.ident,
347347
r.shortest_ident()
348348
)
@@ -384,8 +384,8 @@ fn register_or_cluster_block_stable(
384384
let pad = if let Some(pad) = reg_block_field.offset.checked_sub(offset) {
385385
pad
386386
} else {
387-
eprintln!(
388-
"WARNING {:?} overlaps with another register block at offset {}. \
387+
warn!(
388+
"{:?} overlaps with another register block at offset {}. \
389389
Ignoring.",
390390
reg_block_field.field.ident, reg_block_field.offset
391391
);
@@ -473,8 +473,8 @@ fn register_or_cluster_block_nightly(
473473
if reg_block_field.offset != region.offset {
474474
// TODO: need to emit padding for this case.
475475
// Happens for freescale_mkl43z4
476-
eprintln!(
477-
"WARNING: field {:?} has different offset {} than its union container {}",
476+
warn!(
477+
"field {:?} has different offset {} than its union container {}",
478478
reg_block_field.field.ident, reg_block_field.offset, region.offset
479479
);
480480
}

src/main.rs

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
extern crate cast;
44
extern crate clap;
55
extern crate either;
6+
extern crate env_logger;
67
#[macro_use]
78
extern crate error_chain;
89
extern crate inflections;
910
#[macro_use]
11+
extern crate log;
12+
#[macro_use]
1013
extern crate quote;
1114
extern crate svd_parser as svd;
1215
extern crate syn;
@@ -48,12 +51,25 @@ fn run() -> Result<()> {
4851
.long("nightly")
4952
.help("Enable features only available to nightly rustc"),
5053
)
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+
)
5165
.version(concat!(
5266
env!("CARGO_PKG_VERSION"),
5367
include_str!(concat!(env!("OUT_DIR"), "/commit-info.txt"))
5468
))
5569
.get_matches();
5670

71+
setup_logging(&matches);
72+
5773
let target = matches
5874
.value_of("target")
5975
.map(|s| Target::parse(s))
@@ -93,21 +109,46 @@ fn run() -> Result<()> {
93109
Ok(())
94110
}
95111

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+
96140
fn main() {
97141
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);
102143

103144
for e in e.iter().skip(1) {
104-
writeln!(stderr, "caused by: {}", e).ok();
145+
error!("caused by: {}", e);
105146
}
106147

107148
if let Some(backtrace) = e.backtrace() {
108-
writeln!(stderr, "backtrace: {:?}", backtrace).ok();
149+
error!("backtrace: {:?}", backtrace);
109150
} 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")
111152
}
112153

113154
process::exit(1);

0 commit comments

Comments
 (0)