Skip to content

Commit b551689

Browse files
committed
anyhow
1 parent f7cb4c3 commit b551689

File tree

9 files changed

+34
-40
lines changed

9 files changed

+34
-40
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,16 @@ path = "src/main.rs"
3535
cast = "0.2.2"
3636
clap = "2.26.0"
3737
env_logger = "~0.5"
38-
error-chain = "0.11.0"
3938
inflections = "1.1.0"
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]
46+
git = "https://github.com/rust-embedded/svd"
47+
branch = "anyhow"
4548
version = "0.8.1"
4649
features = ["derive-from"]
4750

src/errors.rs

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

src/generate/device.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::fs::File;
44
use std::io::Write;
55
use crate::svd::Device;
66

7-
use crate::errors::*;
7+
use anyhow::Result;
88
use crate::util::{self, ToSanitizedUpperCase};
99
use crate::Target;
1010

src/generate/interrupt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::svd::Peripheral;
55
use cast::u64;
66
use proc_macro2::{Ident, Span, TokenStream};
77

8-
use crate::errors::*;
8+
use anyhow::Result;
99
use crate::util::{self, ToSanitizedUpperCase};
1010
use crate::Target;
1111

src/generate/peripheral.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use proc_macro2::{Ident, Span, Punct, Spacing};
1010
use log::warn;
1111
use syn::{parse_str, Token};
1212

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

1616
use crate::generate::register;
@@ -600,7 +600,7 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
600600
let defs = cluster.default_register_properties.derive_from(defs);
601601

602602
let cluster_size = cluster_size_in_bits(cluster, &defs)
603-
.chain_err(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
603+
.context(format!("Cluster {} has no determinable `size` field", cluster.name))?;
604604

605605
match cluster {
606606
Cluster::Single(info) => cluster_expanded.push(RegisterBlockField {
@@ -657,7 +657,7 @@ fn expand_register(
657657
let register_size = register
658658
.size
659659
.or(defs.size)
660-
.ok_or_else(|| format!("Register {} has no `size` field", register.name))?;
660+
.ok_or_else(|| anyhow!("Register {} has no `size` field", register.name))?;
661661

662662
match register {
663663
Register::Single(info) => register_expanded.push(RegisterBlockField {

src/generate/register.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use cast::u64;
66
use log::warn;
77
use proc_macro2::{TokenStream, Ident, Span, Punct, Spacing};
88

9-
use crate::errors::*;
9+
use anyhow::{Result, anyhow};
1010
use crate::util::{self, ToSanitizedSnakeCase, ToSanitizedUpperCase, U32Ext};
1111

1212
pub fn render(
@@ -25,7 +25,7 @@ pub fn render(
2525
let rsize = register
2626
.size
2727
.or(defs.size)
28-
.ok_or_else(|| format!("Register {} has no `size` field", register.name))?;
28+
.ok_or_else(|| anyhow!("Register {} has no `size` field", register.name))?;
2929
let rsize = if rsize < 8 {
3030
8
3131
} else if rsize.is_power_of_two() {
@@ -616,7 +616,7 @@ impl Variant {
616616
.filter(|field| field.name.to_lowercase() != "reserved")
617617
.map(|ev| {
618618
let value = u64(ev.value.ok_or_else(|| {
619-
format!("EnumeratedValue {} has no `<value>` field", ev.name)
619+
anyhow!("EnumeratedValue {} has no `<value>` field", ev.name)
620620
})?);
621621

622622
Ok(Variant {
@@ -820,7 +820,7 @@ fn lookup_in_fields<'f>(
820820
if let Some(base_field) = fields.iter().find(|f| f.name == base_field) {
821821
return lookup_in_field(base_evs, None, None, base_field);
822822
} else {
823-
Err(format!(
823+
Err(anyhow!(
824824
"Field {} not found in register {}",
825825
base_field, register.name
826826
))?
@@ -846,13 +846,13 @@ fn lookup_in_peripheral<'p>(
846846
{
847847
lookup_in_field(base_evs, Some(base_register), base_peripheral, field)
848848
} else {
849-
Err(format!(
849+
Err(anyhow!(
850850
"No field {} in register {}",
851851
base_field, register.name
852852
))?
853853
}
854854
} else {
855-
Err(format!(
855+
Err(anyhow!(
856856
"No register {} in peripheral {}",
857857
base_register, peripheral.name
858858
))?
@@ -878,7 +878,7 @@ fn lookup_in_field<'f>(
878878
}
879879
}
880880

881-
Err(format!(
881+
Err(anyhow!(
882882
"No EnumeratedValues {} in field {}",
883883
base_evs, field.name
884884
))?
@@ -901,7 +901,7 @@ fn lookup_in_register<'r>(
901901
}
902902

903903
match matches.first() {
904-
None => Err(format!(
904+
None => Err(anyhow!(
905905
"EnumeratedValues {} not found in register {}",
906906
base_evs, register.name
907907
))?,
@@ -917,7 +917,7 @@ fn lookup_in_register<'r>(
917917
))
918918
} else {
919919
let fields = matches.iter().map(|(f, _)| &f.name).collect::<Vec<_>>();
920-
Err(format!(
920+
Err(anyhow!(
921921
"Fields {:?} have an \
922922
enumeratedValues named {}",
923923
fields, base_evs
@@ -945,7 +945,7 @@ fn lookup_in_peripherals<'p>(
945945
peripheral,
946946
)
947947
} else {
948-
Err(format!("No peripheral {}", base_peripheral))?
948+
Err(anyhow!("No peripheral {}", base_peripheral))?
949949
}
950950
}
951951

src/lib.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -433,13 +433,10 @@
433433
//! compiler. Currently there are no nightly features the flag is only kept for compatibility with prior versions.
434434
#![recursion_limit = "128"]
435435

436-
#[macro_use]
437-
extern crate error_chain;
438436
#[macro_use]
439437
extern crate quote;
440438
use svd_parser as svd;
441439

442-
mod errors;
443440
mod generate;
444441
mod util;
445442

@@ -461,18 +458,20 @@ pub struct DeviceSpecific {
461458
_extensible: (),
462459
}
463460

464-
type Result<T> = std::result::Result<T, SvdError>;
465-
#[derive(Debug)]
461+
use anyhow::Result;
462+
#[derive(Debug, thiserror::Error)]
466463
pub enum SvdError {
464+
#[error("Cannot format crate")]
467465
Fmt,
466+
#[error("Cannot render SVD device")]
468467
Render,
469468
}
470469

471470
/// Generates rust code for the specified svd content.
472471
pub fn generate(xml: &str, target: Target, nightly: bool) -> Result<Generation> {
473472
use std::fmt::Write;
474473

475-
let device = svd::parse(xml).unwrap(); //TODO(AJM)
474+
let device = svd::parse(xml)?;
476475
let mut device_x = String::new();
477476
let items = generate::device::render(&device, target, nightly, false, &mut device_x)
478477
.or(Err(SvdError::Render))?;

src/main.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
#![recursion_limit = "128"]
22

3-
#[macro_use]
4-
extern crate error_chain;
53
#[macro_use]
64
extern crate log;
75
#[macro_use]
86
extern crate quote;
97
use svd_parser as svd;
108

11-
mod errors;
129
mod generate;
1310
mod util;
1411

1512
use std::fs::File;
1613
use std::io::Write;
1714
use std::process;
1815

16+
use anyhow::{Context, Result};
1917
use clap::{App, Arg};
2018

21-
use crate::errors::*;
2219
use crate::util::{build_rs, Target};
2320

2421
fn run() -> Result<()> {
@@ -79,20 +76,20 @@ fn run() -> Result<()> {
7976
match matches.value_of("input") {
8077
Some(file) => {
8178
File::open(file)
82-
.chain_err(|| "couldn't open the SVD file")?
79+
.context("couldn't open the SVD file")?
8380
.read_to_string(xml)
84-
.chain_err(|| "couldn't read the SVD file")?;
81+
.context("couldn't read the SVD file")?;
8582
}
8683
None => {
8784
let stdin = std::io::stdin();
8885
stdin
8986
.lock()
9087
.read_to_string(xml)
91-
.chain_err(|| "couldn't read from stdin")?;
88+
.context("couldn't read from stdin")?;
9289
}
9390
}
9491

95-
let device = svd::parse(xml).unwrap(); //TODO(AJM)
92+
let device = svd::parse(xml)?;
9693

9794
let nightly = matches.is_present("nightly_features");
9895

@@ -144,15 +141,11 @@ fn main() {
144141
if let Err(ref e) = run() {
145142
error!("{}", e);
146143

147-
for e in e.iter().skip(1) {
144+
for e in e.chain().skip(1) {
148145
error!("caused by: {}", e);
149146
}
150147

151-
if let Some(backtrace) = e.backtrace() {
152-
error!("backtrace: {:?}", backtrace);
153-
} else {
154-
error!("note: run with `RUST_BACKTRACE=1` for a backtrace")
155-
}
148+
error!("backtrace: {:?}", e.backtrace());
156149

157150
process::exit(1);
158151
}

src/util.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::svd::{Access, Cluster, Register, RegisterCluster};
55
use proc_macro2::{TokenStream, Ident, Span, Literal};
66
use crate::quote::{TokenStreamExt, ToTokens};
77

8-
use crate::errors::*;
8+
use anyhow::{Result, anyhow, bail};
99

1010
pub const BITS_PER_BYTE: u32 = 8;
1111

@@ -266,7 +266,7 @@ impl U32Ext for u32 {
266266
9..=16 => Ident::new("u16", span),
267267
17..=32 => Ident::new("u32", span),
268268
33..=64 => Ident::new("u64", span),
269-
_ => Err(format!(
269+
_ => Err(anyhow!(
270270
"can't convert {} bits into a Rust integral type",
271271
*self
272272
))?,
@@ -280,7 +280,7 @@ impl U32Ext for u32 {
280280
9..=16 => 16,
281281
17..=32 => 32,
282282
33..=64 => 64,
283-
_ => Err(format!(
283+
_ => Err(anyhow!(
284284
"can't convert {} bits into a Rust integral type width",
285285
*self
286286
))?,

0 commit comments

Comments
 (0)