Skip to content

Commit fbc831f

Browse files
burrbulltherealprof
authored andcommitted
Register derived from (resolve) (#312)
* 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. * Fix import of logging macro. * Remove some noise in the generated code Struct initialisations don't need to repeat field names if they're equal to a local variable. Signed-off-by: Daniel Egger <[email protected]>
1 parent e76f2c2 commit fbc831f

File tree

5 files changed

+61
-18
lines changed

5 files changed

+61
-18
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.7.0"
3840
syn = "0.11.11"

src/generate/peripheral.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::svd::{
77
};
88
use quote::{ToTokens, Tokens};
99
use syn::{self, Ident};
10+
use log::warn;
1011

1112
use crate::errors::*;
1213
use crate::util::{self, ToSanitizedSnakeCase, ToSanitizedUpperCase, BITS_PER_BYTE};
@@ -442,8 +443,8 @@ impl FieldRegions {
442443
r.fields.len() > 1 && (idents.iter().filter(|ident| **ident == r.ident).count() > 1)
443444
})
444445
.inspect(|r| {
445-
eprintln!(
446-
"WARNING: Found type name conflict with region {:?}, renamed to {:?}",
446+
warn!(
447+
"Found type name conflict with region {:?}, renamed to {:?}",
447448
r.ident,
448449
r.shortest_ident()
449450
)
@@ -485,8 +486,8 @@ fn register_or_cluster_block_stable(
485486
let pad = if let Some(pad) = reg_block_field.offset.checked_sub(offset) {
486487
pad
487488
} else {
488-
eprintln!(
489-
"WARNING {:?} overlaps with another register block at offset {}. \
489+
warn!(
490+
"{:?} overlaps with another register block at offset {}. \
490491
Ignoring.",
491492
reg_block_field.field.ident, reg_block_field.offset
492493
);
@@ -574,8 +575,8 @@ fn register_or_cluster_block_nightly(
574575
if reg_block_field.offset != region.offset {
575576
// TODO: need to emit padding for this case.
576577
// Happens for freescale_mkl43z4
577-
eprintln!(
578-
"WARNING: field {:?} has different offset {} than its union container {}",
578+
warn!(
579+
"field {:?} has different offset {} than its union container {}",
579580
reg_block_field.field.ident, reg_block_field.offset, region.offset
580581
);
581582
}

src/generate/register.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ pub fn render(
5151
for<'w> F: FnOnce(&R, &'w mut W) -> &'w mut W
5252
{
5353
let bits = self.register.get();
54-
let r = R { bits: bits };
55-
let mut w = W { bits: bits };
54+
let r = R { bits };
55+
let mut w = W { bits };
5656
f(&r, &mut w);
5757
self.register.set(w.bits);
5858
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ pub enum SvdError {
463463
pub fn generate(xml: &str, target: Target, nightly: bool) -> Result<Generation> {
464464
use std::fmt::Write;
465465

466-
let device = svd::parse(xml).expect("//TODO(AJM)");
466+
let device = svd::parse(xml).unwrap(); //TODO(AJM)
467467
let mut device_x = String::new();
468468
let items = generate::device::render(&device, target, nightly, &mut device_x)
469469
.or(Err(SvdError::Render))?;

src/main.rs

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#[macro_use]
44
extern crate error_chain;
55
#[macro_use]
6+
extern crate log;
7+
#[macro_use]
68
extern crate quote;
79
use svd_parser as svd;
810

@@ -43,12 +45,25 @@ fn run() -> Result<()> {
4345
.long("nightly")
4446
.help("Enable features only available to nightly rustc"),
4547
)
48+
.arg(
49+
Arg::with_name("log_level")
50+
.long("log")
51+
.short("l")
52+
.help(&format!(
53+
"Choose which messages to log (overrides {})",
54+
env_logger::DEFAULT_FILTER_ENV
55+
))
56+
.takes_value(true)
57+
.possible_values(&["off", "error", "warn", "info", "debug", "trace"])
58+
)
4659
.version(concat!(
4760
env!("CARGO_PKG_VERSION"),
4861
include_str!(concat!(env!("OUT_DIR"), "/commit-info.txt"))
4962
))
5063
.get_matches();
5164

65+
setup_logging(&matches);
66+
5267
let target = matches
5368
.value_of("target")
5469
.map(|s| Target::parse(s))
@@ -71,7 +86,7 @@ fn run() -> Result<()> {
7186
}
7287
}
7388

74-
let device = svd::parse(xml).expect("//TODO(AJM)");
89+
let device = svd::parse(xml).unwrap(); //TODO(AJM)
7590

7691
let nightly = matches.is_present("nightly_features");
7792

@@ -88,21 +103,46 @@ fn run() -> Result<()> {
88103
Ok(())
89104
}
90105

91-
fn main() {
92-
if let Err(e) = &run() {
93-
let stderr = io::stderr();
94-
let mut stderr = stderr.lock();
106+
fn setup_logging(matches: &clap::ArgMatches) {
107+
// * Log at info by default.
108+
// * Allow users the option of setting complex logging filters using
109+
// env_logger's `RUST_LOG` environment variable.
110+
// * Override both of those if the logging level is set via the `--log`
111+
// command line argument.
112+
let env = env_logger::Env::default()
113+
.filter_or(env_logger::DEFAULT_FILTER_ENV, "info");
114+
let mut builder = env_logger::Builder::from_env(env);
115+
builder.default_format_timestamp(false);
116+
117+
let log_lvl_from_env =
118+
std::env::var_os(env_logger::DEFAULT_FILTER_ENV).is_some();
119+
120+
if log_lvl_from_env {
121+
log::set_max_level(log::LevelFilter::Trace);
122+
} else {
123+
let level = match matches.value_of("log_level") {
124+
Some(lvl) => lvl.parse().unwrap(),
125+
None => log::LevelFilter::Info,
126+
};
127+
log::set_max_level(level);
128+
builder.filter_level(level);
129+
}
95130

96-
writeln!(stderr, "error: {}", e).ok();
131+
builder.init();
132+
}
133+
134+
fn main() {
135+
if let Err(ref e) = run() {
136+
error!("{}", e);
97137

98138
for e in e.iter().skip(1) {
99-
writeln!(stderr, "caused by: {}", e).ok();
139+
error!("caused by: {}", e);
100140
}
101141

102142
if let Some(backtrace) = e.backtrace() {
103-
writeln!(stderr, "backtrace: {:?}", backtrace).ok();
143+
error!("backtrace: {:?}", backtrace);
104144
} else {
105-
writeln!(stderr, "note: run with `RUST_BACKTRACE=1` for a backtrace").ok();
145+
error!("note: run with `RUST_BACKTRACE=1` for a backtrace")
106146
}
107147

108148
process::exit(1);

0 commit comments

Comments
 (0)