Skip to content

Commit f2d2ad2

Browse files
bors[bot]achan1989
andcommitted
Merge #237
237: Introduce a logging system. r=ryankurte a=achan1989 This pull request makes progress on #183. I've replaced the existing print/eprint calls with the appropriate logging macros, and arbitrarily chose env_logger to handle the logging. This should be functionally identical to the branch point, although the format of the logging output is different -- it's now of the form `<SEVERITY> svd2rust: <message>`. Co-authored-by: achan1989 <achan1989@gmail.com>
2 parents 08c8d07 + 6b8f453 commit f2d2ad2

File tree

3 files changed

+57
-13
lines changed

3 files changed

+57
-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: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use either::Either;
55
use quote::{ToTokens, Tokens};
66
use crate::svd::{Cluster, ClusterInfo, Defaults, Peripheral, Register};
77
use syn::{self, Ident};
8+
use log::warn;
89

910
use crate::errors::*;
1011
use crate::util::{self, ToSanitizedSnakeCase, ToSanitizedUpperCase, BITS_PER_BYTE};
@@ -341,8 +342,8 @@ impl FieldRegions {
341342
r.fields.len() > 1 && (idents.iter().filter(|ident| **ident == r.ident).count() > 1)
342343
})
343344
.inspect(|r| {
344-
eprintln!(
345-
"WARNING: Found type name conflict with region {:?}, renamed to {:?}",
345+
warn!(
346+
"Found type name conflict with region {:?}, renamed to {:?}",
346347
r.ident,
347348
r.shortest_ident()
348349
)
@@ -384,8 +385,8 @@ fn register_or_cluster_block_stable(
384385
let pad = if let Some(pad) = reg_block_field.offset.checked_sub(offset) {
385386
pad
386387
} else {
387-
eprintln!(
388-
"WARNING {:?} overlaps with another register block at offset {}. \
388+
warn!(
389+
"{:?} overlaps with another register block at offset {}. \
389390
Ignoring.",
390391
reg_block_field.field.ident, reg_block_field.offset
391392
);
@@ -473,8 +474,8 @@ fn register_or_cluster_block_nightly(
473474
if reg_block_field.offset != region.offset {
474475
// TODO: need to emit padding for this case.
475476
// Happens for freescale_mkl43z4
476-
eprintln!(
477-
"WARNING: field {:?} has different offset {} than its union container {}",
477+
warn!(
478+
"field {:?} has different offset {} than its union container {}",
478479
reg_block_field.field.ident, reg_block_field.offset, region.offset
479480
);
480481
}

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)