Skip to content

Commit 6771c10

Browse files
authored
Try #398:
2 parents afb96f7 + 825a367 commit 6771c10

File tree

10 files changed

+126
-135
lines changed

10 files changed

+126
-135
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1313

1414
### Changed
1515

16+
- `anyhow` crate is used for error handling
17+
1618
- [breaking-change] Among other cleanups, MSP430 crates are now expected to
1719
use the `msp430_rt::interrupt` attribute macro and `device.x` for interrupt
1820
support. The `INTERRUPT` array has been renamed `__INTERRUPT`.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ path = "src/main.rs"
3535
cast = "0.2"
3636
clap = "2.33"
3737
env_logger = "~0.7"
38-
error-chain = "0.12"
3938
inflections = "1.1"
4039
log = { version = "~0.4", features = ["std"] }
4140
quote = "1.0"
4241
proc-macro2 = "1.0"
42+
anyhow = "1.0.19"
43+
thiserror = "1.0.5"
4344

4445
[dependencies.svd-parser]
4546
version = "0.9"

src/errors.rs

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/generate/device.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use quote::ToTokens;
44
use std::fs::File;
55
use std::io::Write;
66

7-
use crate::errors::*;
87
use crate::util::{self, ToSanitizedUpperCase};
98
use crate::Target;
9+
use anyhow::Result;
1010

1111
use crate::generate::{interrupt, peripheral};
1212

@@ -155,11 +155,11 @@ pub fn render(
155155
});
156156
}
157157

158-
let generic_file = std::str::from_utf8(include_bytes!("generic.rs")).unwrap();
158+
let generic_file = std::str::from_utf8(include_bytes!("generic.rs"))?;
159159
if generic_mod {
160-
writeln!(File::create("generic.rs").unwrap(), "{}", generic_file).unwrap();
160+
writeln!(File::create("generic.rs")?, "{}", generic_file)?;
161161
} else {
162-
let tokens = syn::parse_file(generic_file).unwrap().into_token_stream();
162+
let tokens = syn::parse_file(generic_file)?.into_token_stream();
163163

164164
out.extend(quote! {
165165
#[allow(unused_imports)]

src/generate/interrupt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use crate::svd::Peripheral;
55
use cast::u64;
66
use proc_macro2::{Ident, Span, TokenStream};
77

8-
use crate::errors::*;
98
use crate::util::{self, ToSanitizedUpperCase};
109
use crate::Target;
10+
use anyhow::Result;
1111

1212
/// Generates code for `src/interrupt.rs`
1313
pub fn render(
@@ -72,7 +72,7 @@ pub fn render(
7272
match target {
7373
Target::CortexM => {
7474
for name in &names {
75-
writeln!(device_x, "PROVIDE({} = DefaultHandler);", name).unwrap();
75+
writeln!(device_x, "PROVIDE({} = DefaultHandler);", name)?;
7676
}
7777

7878
root.extend(quote! {

src/generate/peripheral.rs

Lines changed: 54 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use quote::ToTokens;
1010
use svd_parser::derive_from::DeriveFrom;
1111
use syn::{parse_str, Token};
1212

13-
use crate::errors::*;
1413
use crate::util::{self, ToSanitizedSnakeCase, ToSanitizedUpperCase, BITS_PER_BYTE};
14+
use anyhow::{anyhow, bail, Context, Result};
1515

1616
use crate::generate::register;
1717

@@ -31,11 +31,10 @@ pub fn render(
3131
let p_merged = p_derivedfrom.map(|ancestor| p_original.derive_from(ancestor));
3232
let p = p_merged.as_ref().unwrap_or(p_original);
3333

34-
if p_original.derived_from.is_some() && p_derivedfrom.is_none() {
34+
if let (Some(df), None) = (p_original.derived_from.as_ref(), &p_derivedfrom) {
3535
eprintln!(
3636
"Couldn't find derivedFrom original: {} for {}, skipping",
37-
p_original.derived_from.as_ref().unwrap(),
38-
p_original.name
37+
df, p_original.name
3938
);
4039
return Ok(out);
4140
}
@@ -44,13 +43,12 @@ pub fn render(
4443
let name_pc = Ident::new(&p.name.to_sanitized_upper_case(), span);
4544
let address = util::hex(p.base_address as u64);
4645
let description = util::respace(p.description.as_ref().unwrap_or(&p.name));
47-
let derive_regs = p_derivedfrom.is_some() && p_original.registers.is_none();
4846

4947
let name_sc = Ident::new(&p.name.to_sanitized_snake_case(), span);
50-
let base = if derive_regs {
51-
Ident::new(&p_derivedfrom.unwrap().name.to_sanitized_snake_case(), span)
48+
let (derive_regs, base) = if let (Some(df), None) = (p_derivedfrom, &p_original.registers) {
49+
(true, Ident::new(&df.name.to_sanitized_snake_case(), span))
5250
} else {
53-
name_sc.clone()
51+
(false, name_sc.clone())
5452
};
5553

5654
// Insert the peripheral structure
@@ -607,11 +605,11 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
607605
let defs = cluster.default_register_properties.derive_from(defs);
608606

609607
let cluster_size = cluster_size_in_bits(cluster, &defs)
610-
.chain_err(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
608+
.with_context(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
611609

612610
match cluster {
613611
Cluster::Single(info) => cluster_expanded.push(RegisterBlockField {
614-
field: convert_svd_cluster(cluster),
612+
field: convert_svd_cluster(cluster)?,
615613
description: info.description.as_ref().unwrap_or(&info.name).into(),
616614
offset: info.address_offset,
617615
size: cluster_size,
@@ -631,13 +629,13 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
631629

632630
if array_convertible {
633631
cluster_expanded.push(RegisterBlockField {
634-
field: convert_svd_cluster(&cluster),
632+
field: convert_svd_cluster(&cluster)?,
635633
description: info.description.as_ref().unwrap_or(&info.name).into(),
636634
offset: info.address_offset,
637635
size: cluster_size * array_info.dim,
638636
});
639637
} else {
640-
for (field_num, field) in expand_svd_cluster(cluster).iter().enumerate() {
638+
for (field_num, field) in expand_svd_cluster(cluster)?.iter().enumerate() {
641639
cluster_expanded.push(RegisterBlockField {
642640
field: field.clone(),
643641
description: info.description.as_ref().unwrap_or(&info.name).into(),
@@ -664,12 +662,12 @@ fn expand_register(
664662
let register_size = register
665663
.size
666664
.or(defs.size)
667-
.ok_or_else(|| format!("Register {} has no `size` field", register.name))?;
665+
.ok_or_else(|| anyhow!("Register {} has no `size` field", register.name))?;
668666

669667
match register {
670668
Register::Single(info) => register_expanded.push(RegisterBlockField {
671-
field: convert_svd_register(register, name),
672-
description: info.description.clone().unwrap_or_else(|| "".to_string()),
669+
field: convert_svd_register(register, name)?,
670+
description: info.description.clone().unwrap_or_default(),
673671
offset: info.address_offset,
674672
size: register_size,
675673
}),
@@ -688,16 +686,16 @@ fn expand_register(
688686

689687
if array_convertible {
690688
register_expanded.push(RegisterBlockField {
691-
field: convert_svd_register(&register, name),
692-
description: info.description.clone().unwrap_or_else(|| "".to_string()),
689+
field: convert_svd_register(&register, name)?,
690+
description: info.description.clone().unwrap_or_default(),
693691
offset: info.address_offset,
694692
size: register_size * array_info.dim,
695693
});
696694
} else {
697-
for (field_num, field) in expand_svd_register(register, name).iter().enumerate() {
695+
for (field_num, field) in expand_svd_register(register, name)?.iter().enumerate() {
698696
register_expanded.push(RegisterBlockField {
699697
field: field.clone(),
700-
description: info.description.clone().unwrap_or_else(|| "".to_string()),
698+
description: info.description.clone().unwrap_or_default(),
701699
offset: info.address_offset + field_num as u32 * array_info.dim_increment,
702700
size: register_size,
703701
});
@@ -768,8 +766,11 @@ fn cluster_block(
768766

769767
/// Takes a svd::Register which may be a register array, and turn in into
770768
/// a list of syn::Field where the register arrays have been expanded.
771-
fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Field> {
772-
let name_to_ty = |name: &String, ns: Option<&str>| -> syn::Type {
769+
fn expand_svd_register(
770+
register: &Register,
771+
name: Option<&str>,
772+
) -> Result<Vec<syn::Field>, syn::Error> {
773+
let name_to_ty = |name: &String, ns: Option<&str>| -> Result<syn::Type, syn::Error> {
773774
let ident = if let Some(ns) = ns {
774775
Cow::Owned(
775776
String::from("self::")
@@ -781,13 +782,13 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
781782
name.to_sanitized_upper_case()
782783
};
783784

784-
syn::Type::Path(parse_str::<syn::TypePath>(&ident).unwrap())
785+
Ok(syn::Type::Path(parse_str::<syn::TypePath>(&ident)?))
785786
};
786787

787788
let mut out = vec![];
788789

789790
match register {
790-
Register::Single(_info) => out.push(convert_svd_register(register, name)),
791+
Register::Single(_info) => out.push(convert_svd_register(register, name)?),
791792
Register::Array(info, array_info) => {
792793
let indices = array_info
793794
.dim_index
@@ -806,17 +807,17 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
806807
for (idx, _i) in indices.iter().zip(0..) {
807808
let nb_name = util::replace_suffix(&info.name, idx);
808809

809-
let ty = name_to_ty(&ty_name, name);
810+
let ty = name_to_ty(&ty_name, name)?;
810811

811812
out.push(new_syn_field(&nb_name.to_sanitized_snake_case(), ty));
812813
}
813814
}
814815
}
815-
out
816+
Ok(out)
816817
}
817818

818819
/// Convert a parsed `Register` into its `Field` equivalent
819-
fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
820+
fn convert_svd_register(register: &Register, name: Option<&str>) -> Result<syn::Field, syn::Error> {
820821
let name_to_ty = |name: &String, ns: Option<&str>| -> String {
821822
if let Some(ns) = ns {
822823
String::from("self::")
@@ -828,39 +829,38 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
828829
}
829830
};
830831

831-
match register {
832+
Ok(match register {
832833
Register::Single(info) => new_syn_field(
833834
&info.name.to_sanitized_snake_case(),
834-
syn::Type::Path(parse_str::<syn::TypePath>(&name_to_ty(&info.name, name)).unwrap()),
835+
syn::Type::Path(parse_str::<syn::TypePath>(&name_to_ty(&info.name, name))?),
835836
),
836837
Register::Array(info, array_info) => {
837838
let nb_name = util::replace_suffix(&info.name, "");
838839

839-
let ty = syn::Type::Array(
840-
parse_str::<syn::TypeArray>(&format!(
841-
"[{};{}]",
842-
name_to_ty(&nb_name, name),
843-
u64::from(array_info.dim)
844-
))
845-
.unwrap(),
846-
);
840+
let ty = syn::Type::Array(parse_str::<syn::TypeArray>(&format!(
841+
"[{};{}]",
842+
name_to_ty(&nb_name, name),
843+
u64::from(array_info.dim)
844+
))?);
847845

848846
new_syn_field(&nb_name.to_sanitized_snake_case(), ty)
849847
}
850-
}
848+
})
851849
}
852850

853851
/// Takes a svd::Cluster which may contain a register array, and turn in into
854852
/// a list of syn::Field where the register arrays have been expanded.
855-
fn expand_svd_cluster(cluster: &Cluster) -> Vec<syn::Field> {
856-
let name_to_ty = |name: &String| -> syn::Type {
857-
syn::Type::Path(parse_str::<syn::TypePath>(&name.to_sanitized_upper_case()).unwrap())
853+
fn expand_svd_cluster(cluster: &Cluster) -> Result<Vec<syn::Field>, syn::Error> {
854+
let name_to_ty = |name: &String| -> Result<syn::Type, syn::Error> {
855+
Ok(syn::Type::Path(parse_str::<syn::TypePath>(
856+
&name.to_sanitized_upper_case(),
857+
)?))
858858
};
859859

860860
let mut out = vec![];
861861

862862
match &cluster {
863-
Cluster::Single(_info) => out.push(convert_svd_cluster(cluster)),
863+
Cluster::Single(_info) => out.push(convert_svd_cluster(cluster)?),
864864
Cluster::Array(info, array_info) => {
865865
let indices = array_info
866866
.dim_index
@@ -879,39 +879,36 @@ fn expand_svd_cluster(cluster: &Cluster) -> Vec<syn::Field> {
879879
for (idx, _i) in indices.iter().zip(0..) {
880880
let name = util::replace_suffix(&info.name, idx);
881881

882-
let ty = name_to_ty(&ty_name);
882+
let ty = name_to_ty(&ty_name)?;
883883

884884
out.push(new_syn_field(&name.to_sanitized_snake_case(), ty));
885885
}
886886
}
887887
}
888-
out
888+
Ok(out)
889889
}
890890

891891
/// Convert a parsed `Cluster` into its `Field` equivalent
892-
fn convert_svd_cluster(cluster: &Cluster) -> syn::Field {
893-
match cluster {
892+
fn convert_svd_cluster(cluster: &Cluster) -> Result<syn::Field, syn::Error> {
893+
Ok(match cluster {
894894
Cluster::Single(info) => new_syn_field(
895895
&info.name.to_sanitized_snake_case(),
896-
syn::Type::Path(
897-
parse_str::<syn::TypePath>(&info.name.to_sanitized_upper_case()).unwrap(),
898-
),
896+
syn::Type::Path(parse_str::<syn::TypePath>(
897+
&info.name.to_sanitized_upper_case(),
898+
)?),
899899
),
900900
Cluster::Array(info, array_info) => {
901901
let name = util::replace_suffix(&info.name, "");
902902

903-
let ty = syn::Type::Array(
904-
parse_str::<syn::TypeArray>(&format!(
905-
"[{};{}]",
906-
&name.to_sanitized_upper_case(),
907-
u64::from(array_info.dim)
908-
))
909-
.unwrap(),
910-
);
903+
let ty = syn::Type::Array(parse_str::<syn::TypeArray>(&format!(
904+
"[{};{}]",
905+
&name.to_sanitized_upper_case(),
906+
u64::from(array_info.dim)
907+
))?);
911908

912909
new_syn_field(&name.to_sanitized_snake_case(), ty)
913910
}
914-
}
911+
})
915912
}
916913

917914
fn new_syn_field(ident: &str, ty: syn::Type) -> syn::Field {

0 commit comments

Comments
 (0)