Skip to content

Commit d38e45e

Browse files
author
Jorge Aparicio
committed
hopefully better error (panic!) messages
1 parent f4bf34e commit d38e45e

File tree

1 file changed

+85
-60
lines changed

1 file changed

+85
-60
lines changed

src/lib.rs

Lines changed: 85 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -456,21 +456,22 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
456456
let mut fields = vec![];
457457
let mut offset = 0;
458458
let mut i = 0;
459-
let registers = p.registers
460-
.as_ref()
461-
.expect(&format!("{:#?} has no `registers` field", p));
459+
let registers =
460+
p.registers
461+
.as_ref()
462+
.expect(&format!("Peripheral {} has no `registers` field", p.name));
462463

463464
for register in &expand(registers) {
464465
let pad = if let Some(pad) = register.offset
465-
.checked_sub(offset) {
466+
.checked_sub(offset) {
466467
pad
467468
} else {
468469
writeln!(io::stderr(),
469470
"WARNING {} overlaps with another register at offset \
470471
{}. Ignoring.",
471472
register.name,
472473
register.offset)
473-
.ok();
474+
.ok();
474475
continue;
475476
};
476477

@@ -486,7 +487,7 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
486487
let comment = &format!("0x{:02x} - {}",
487488
register.offset,
488489
respace(&register.info
489-
.description))
490+
.description))
490491
[..];
491492

492493
let reg_ty = match register.ty {
@@ -501,10 +502,11 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
501502

502503
offset = register.offset +
503504
register.info
504-
.size
505-
.or(d.size)
506-
.expect(&format!("{:#?} has no `size` field", register.info)) /
507-
8;
505+
.size
506+
.or(d.size)
507+
.expect(&format!("Register {}.{} has no `size` field",
508+
p.name,
509+
register.name)) / 8;
508510
}
509511

510512
let p_name = Ident::new(&*p.name.to_sanitized_pascal_case());
@@ -571,8 +573,8 @@ fn expand(registers: &[Register]) -> Vec<ExpandedRegister> {
571573
.map(|v| Cow::from(&**v))
572574
.unwrap_or_else(|| {
573575
Cow::from((0..array_info.dim)
574-
.map(|i| i.to_string())
575-
.collect::<Vec<_>>())
576+
.map(|i| i.to_string())
577+
.collect::<Vec<_>>())
576578
});
577579

578580
for (idx, i) in indices.iter().zip(0..) {
@@ -586,11 +588,12 @@ fn expand(registers: &[Register]) -> Vec<ExpandedRegister> {
586588
i * array_info.dim_increment;
587589

588590
out.push(ExpandedRegister {
589-
info: info,
590-
name: name.to_sanitized_snake_case().into_owned(),
591-
offset: offset,
592-
ty: Either::Right(ty.clone()),
593-
});
591+
info: info,
592+
name: name.to_sanitized_snake_case()
593+
.into_owned(),
594+
offset: offset,
595+
ty: Either::Right(ty.clone()),
596+
});
594597
}
595598
}
596599
}
@@ -616,16 +619,21 @@ fn name_of(r: &Register) -> Cow<str> {
616619

617620
fn access(r: &Register) -> Access {
618621
r.access.unwrap_or_else(|| if let Some(ref fields) = r.fields {
619-
if fields.iter().all(|f| f.access == Some(Access::ReadOnly)) {
620-
Access::ReadOnly
621-
} else if fields.iter().all(|f| f.access == Some(Access::WriteOnly)) {
622+
if fields.iter().all(|f| {
623+
f.access ==
624+
Some(Access::ReadOnly)
625+
}) {
626+
Access::ReadOnly
627+
} else if fields.iter().all(|f| {
628+
f.access == Some(Access::WriteOnly)
629+
}) {
622630
Access::WriteOnly
623631
} else {
624632
Access::ReadWrite
625633
}
626-
} else {
627-
Access::ReadWrite
628-
})
634+
} else {
635+
Access::ReadWrite
636+
})
629637
}
630638

631639
#[cfg_attr(feature = "cargo-clippy", allow(cyclomatic_complexity))]
@@ -642,7 +650,7 @@ pub fn gen_register(r: &Register,
642650

643651
let reg_ty = r.size
644652
.or(d.size)
645-
.expect(&format!("{:#?} has no `size` field", r))
653+
.expect(&format!("Register {} has no `size` field", r.name))
646654
.to_ty();
647655
let access = access(r);
648656

@@ -777,10 +785,10 @@ pub fn gen_register(r: &Register,
777785
continue;
778786
}
779787

780-
let field_name = Ident::new(&*field.name
781-
.to_sanitized_snake_case());
782-
let _field_name =
783-
Ident::new(&*format!("_{}",
788+
let field_name =
789+
Ident::new(&*field.name
790+
.to_sanitized_snake_case());
791+
let _field_name = Ident::new(&*format!("_{}",
784792
field.name
785793
.replace(BLACKLIST_CHARS, "")
786794
.to_snake_case()));
@@ -815,9 +823,10 @@ pub fn gen_register(r: &Register,
815823
let variants = (0..1 << width)
816824
.map(|i| {
817825
let value = u64::from(i);
818-
if let Some(ev) = evs.values
819-
.iter()
820-
.find(|ev| ev.value == Some(i)) {
826+
if let Some(ev) =
827+
evs.values
828+
.iter()
829+
.find(|ev| ev.value == Some(i)) {
821830
let sc = Ident::new(&*ev.name
822831
.replace(BLACKLIST_CHARS, "")
823832
.to_snake_case());
@@ -861,8 +870,9 @@ pub fn gen_register(r: &Register,
861870
.to_sanitized_pascal_case()))
862871
};
863872

864-
if let Some(register) = base.as_ref()
865-
.and_then(|base| base.register) {
873+
if let Some(register) =
874+
base.as_ref()
875+
.and_then(|base| base.register) {
866876
let register =
867877
Ident::new(&*register.to_sanitized_snake_case());
868878

@@ -1004,8 +1014,9 @@ pub fn gen_register(r: &Register,
10041014
continue;
10051015
}
10061016

1007-
let field_name_sc = Ident::new(&*field.name
1008-
.to_sanitized_snake_case());
1017+
let field_name_sc =
1018+
Ident::new(&*field.name
1019+
.to_sanitized_snake_case());
10091020
let width = field.bit_range.width;
10101021
let mask = Lit::Int((1u64 << width) - 1, IntTy::Unsuffixed);
10111022
let offset = Lit::Int(u64::from(field.bit_range.offset),
@@ -1049,8 +1060,9 @@ pub fn gen_register(r: &Register,
10491060
.to_sanitized_pascal_case()))
10501061
};
10511062

1052-
if let Some(register) = base.as_ref()
1053-
.and_then(|base| base.register) {
1063+
if let Some(register) =
1064+
base.as_ref()
1065+
.and_then(|base| base.register) {
10541066
let register =
10551067
Ident::new(&*register.to_sanitized_snake_case());
10561068

@@ -1063,15 +1075,18 @@ pub fn gen_register(r: &Register,
10631075
}
10641076
}
10651077

1066-
let variants =
1067-
evs.values
1068-
.iter()
1069-
.map(|ev| {
1070-
// TODO better error message
1071-
let value = u64::from(ev.value
1072-
.expect("no value in EnumeratedValue"));
1073-
1074-
Variant {
1078+
let variants = evs.values
1079+
.iter()
1080+
.map(|ev| {
1081+
let value =
1082+
u64::from(ev.value
1083+
.expect(&format!("no value in \
1084+
EnumeratedValue in \
1085+
{}.{}",
1086+
r.name,
1087+
field.name)));
1088+
1089+
Variant {
10751090
doc: ev.description
10761091
.clone()
10771092
.unwrap_or_else(|| {
@@ -1083,8 +1098,8 @@ pub fn gen_register(r: &Register,
10831098
.to_sanitized_snake_case()),
10841099
value: value,
10851100
}
1086-
})
1087-
.collect::<Vec<_>>();
1101+
})
1102+
.collect::<Vec<_>>();
10881103

10891104
// Whether the `bits` method should be `unsafe`.
10901105
// `bits` can be safe when enumeratedValues covers all
@@ -1261,33 +1276,43 @@ fn lookup<'a>(evs: &'a [EnumeratedValues],
12611276
let mut parts = base.split('.');
12621277

12631278
let (register, fields, field) = match (parts.next(),
1264-
parts.next()) {
1279+
parts.next()) {
12651280
(Some(register), Some(field)) => {
1266-
// TODO better error message
12671281
let fields = all_registers.iter()
12681282
.find(|r| r.name == register)
1269-
.expect("couldn't find register")
1283+
.expect(&format!("couldn't find register {} \
1284+
requested by 'derivedFrom=\
1285+
\"{}\"'",
1286+
register,
1287+
base))
12701288
.fields
12711289
.as_ref()
1272-
.expect("no fields");
1290+
.expect(&format!("register {} has no fields",
1291+
register));
12731292

12741293
(Some(register), &fields[..], field)
12751294
}
12761295
(Some(field), None) => (None, fields, field),
12771296
_ => unreachable!(),
12781297
};
12791298

1280-
// TODO better error message
1281-
let evs = fields.iter()
1282-
.flat_map(|f| f.enumerated_values.iter())
1283-
.find(|evs| evs.name.as_ref().map(|s| &**s) == Some(field))
1284-
.expect("");
1299+
let evs =
1300+
fields.iter()
1301+
.flat_map(|f| f.enumerated_values.iter())
1302+
.find(|evs| {
1303+
evs.name.as_ref().map(|s| &**s) == Some(field)
1304+
})
1305+
.expect(&format!("couldn't find field {} in {}",
1306+
field,
1307+
register.map(|r| {
1308+
format!("register {}", r)
1309+
}).unwrap_or("this register".to_owned())));
12851310

12861311
(evs,
12871312
Some(Base {
1288-
register: register,
1289-
field: field,
1290-
}))
1313+
register: register,
1314+
field: field,
1315+
}))
12911316
} else {
12921317
(evs, None)
12931318
}

0 commit comments

Comments
 (0)