diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 847a158..590bbe9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 + - run: cargo clippy -- -Dwarnings - run: cargo run -- tests/atmega328p.atdf /dev/null test: diff --git a/Cargo.toml b/Cargo.toml index 47c8a06..b4610e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ homepage = "https://github.com/Rahix/atdf2svd" repository = "https://github.com/Rahix/atdf2svd" keywords = ["atdf", "svd", "avr", "svd2rust"] categories = ["command-line-utilities", "embedded"] -edition = "2018" +edition = "2024" exclude = [ "tests/", @@ -39,6 +39,13 @@ cfg-if = "1.0.0" [dev-dependencies] insta = { version = "1.41.1", features = ["yaml"] } +[profile.dev] +panic = "abort" + +[profile.release] +overflow-checks = true +panic = "abort" + [profile.test.package.insta] opt-level = 3 diff --git a/src/atdf/chip.rs b/src/atdf/chip.rs index 593daba..e7f4eea 100644 --- a/src/atdf/chip.rs +++ b/src/atdf/chip.rs @@ -1,6 +1,6 @@ +use crate::ElementExt; use crate::atdf; use crate::chip; -use crate::ElementExt; use std::collections::BTreeMap; pub fn parse(el: &xmltree::Element) -> crate::Result { @@ -51,8 +51,8 @@ pub fn parse(el: &xmltree::Element) -> crate::Result { // Map interrupts from to let interrupts = interrupts - .iter() - .map(|(_, int)| (int.name.clone(), int.clone())) + .values() + .map(|int| (int.name.clone(), int.clone())) .collect(); Ok(chip::Chip { diff --git a/src/atdf/field.rs b/src/atdf/field.rs index f7ff149..b835a3a 100644 --- a/src/atdf/field.rs +++ b/src/atdf/field.rs @@ -1,7 +1,7 @@ +use crate::ElementExt; use crate::atdf; use crate::chip; use crate::util; -use crate::ElementExt; pub fn parse( bitfield_el: &xmltree::Element, diff --git a/src/atdf/interrupt.rs b/src/atdf/interrupt.rs index 9d250a8..b1ff4e8 100644 --- a/src/atdf/interrupt.rs +++ b/src/atdf/interrupt.rs @@ -1,6 +1,6 @@ +use crate::ElementExt; use crate::chip; use crate::util; -use crate::ElementExt; pub fn parse(interrupt: &xmltree::Element) -> crate::Result { debug_assert!(interrupt.name == "interrupt"); diff --git a/src/atdf/patch.rs b/src/atdf/patch.rs index bb218eb..aca25d3 100644 --- a/src/atdf/patch.rs +++ b/src/atdf/patch.rs @@ -1,7 +1,7 @@ //! Patches for atdf files that can generally be applied +use crate::ElementExt; use crate::chip; use crate::util; -use crate::ElementExt; use std::collections::BTreeMap; const NEW_PORT_REGS: [&str; 10] = [ @@ -20,7 +20,7 @@ pub fn signals_to_port_fields(chip: &mut chip::Chip, tree: &xmltree::Element) -> .values_mut() .filter(|p| p.name.starts_with("PORT") && p.name.len() == 5) { - let name = port.name.chars().rev().next().unwrap(); + let name = port.name.chars().next_back().unwrap(); let pins: Vec<_> = port_module .first_child_by_attr(Some("instance"), "name", &port.name)? diff --git a/src/atdf/peripheral.rs b/src/atdf/peripheral.rs index b5ff771..d748864 100644 --- a/src/atdf/peripheral.rs +++ b/src/atdf/peripheral.rs @@ -1,7 +1,7 @@ +use crate::ElementExt; use crate::atdf; use crate::chip; use crate::util; -use crate::ElementExt; pub fn parse_list( el: &xmltree::Element, diff --git a/src/atdf/register.rs b/src/atdf/register.rs index df1a819..6b83586 100644 --- a/src/atdf/register.rs +++ b/src/atdf/register.rs @@ -1,7 +1,7 @@ +use crate::ElementExt; use crate::atdf; use crate::chip; use crate::util; -use crate::ElementExt; use std::collections::BTreeMap; fn field_map_from_bitfield_children( diff --git a/src/atdf/values.rs b/src/atdf/values.rs index ec1647a..aef0423 100644 --- a/src/atdf/values.rs +++ b/src/atdf/values.rs @@ -1,6 +1,6 @@ +use crate::ElementExt; use crate::chip; use crate::util; -use crate::ElementExt; use std::collections::BTreeMap; pub type ValueGroups = BTreeMap>; diff --git a/src/error.rs b/src/error.rs index 9ecfb5e..1fc6e7c 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,7 +1,7 @@ pub trait DisplayError { fn format(&self, w: &mut dyn std::io::Write) -> std::io::Result<()>; - fn into_panic(&self) -> ! { + fn to_panic(&self) -> ! { let mut message: Vec = "Error: ".into(); self.format(&mut message).unwrap(); panic!("{}", String::from_utf8_lossy(&message)); diff --git a/src/lib.rs b/src/lib.rs index e2545e7..c5c9887 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,7 @@ +#![deny(clippy::as_conversions)] +// TODO: Remove this at some point when the rustc feature is less new +#![allow(clippy::collapsible_if)] + #[macro_use] pub mod error; #[cfg(feature = "cli")] @@ -87,8 +91,8 @@ pub fn run(args: Atdf2SvdOptions) { pub fn run_test(atdf: &mut dyn std::io::Read, auto_patches: Vec<&str>) -> String { let patches = HashSet::from_iter(auto_patches.iter().map(|s| s.to_string())); - let chip = atdf::parse(atdf, &patches).unwrap_or_else(|e| e.into_panic()); + let chip = atdf::parse(atdf, &patches).unwrap_or_else(|e| e.to_panic()); let mut output = Vec::new(); - svd::generate(&chip, &mut output).unwrap_or_else(|e| e.into_panic()); + svd::generate(&chip, &mut output).unwrap_or_else(|e| e.to_panic()); String::from_utf8(output).unwrap() } diff --git a/src/svd/field.rs b/src/svd/field.rs index e5fa0ec..9e36c36 100644 --- a/src/svd/field.rs +++ b/src/svd/field.rs @@ -5,7 +5,10 @@ use std::convert::TryInto; pub fn generate(f: &chip::Field) -> crate::Result { let (write_constraint, enumerated_values) = svd::restriction::generate(&f.restriction, f.width().try_into()?)?; - let (lsb, msb) = (f.range.0 as u32, f.range.1 as u32); + let (lsb, msb) = ( + u32::try_from(f.range.0).unwrap(), + u32::try_from(f.range.1).unwrap(), + ); let field = svd_rs::FieldInfo::builder() .name(f.name.clone()) diff --git a/src/svd/interrupt.rs b/src/svd/interrupt.rs index 9e3ca0b..51cd817 100644 --- a/src/svd/interrupt.rs +++ b/src/svd/interrupt.rs @@ -1,5 +1,5 @@ -use crate::chip; use crate::DisplayError; +use crate::chip; use std::convert::TryInto; pub fn generate(peripherals: &mut [svd_rs::Peripheral], c: &chip::Chip) -> crate::Result<()> { diff --git a/src/svd/mod.rs b/src/svd/mod.rs index 8fb6733..de03bde 100644 --- a/src/svd/mod.rs +++ b/src/svd/mod.rs @@ -8,7 +8,7 @@ pub mod restriction; pub fn generate(c: &crate::chip::Chip, mut w: W) -> crate::Result<()> { let device = chip::generate(c)?; let svd_xml = svd_encoder::encode(&device)?; - w.write(svd_xml.as_bytes())?; + w.write_all(svd_xml.as_bytes())?; Ok(()) } diff --git a/src/svd/peripheral.rs b/src/svd/peripheral.rs index 241c4f5..953d54c 100644 --- a/src/svd/peripheral.rs +++ b/src/svd/peripheral.rs @@ -7,10 +7,8 @@ fn create_address_blocks(p: &chip::Peripheral) -> crate::Result crate::Result { let (write_constraint, _) = - crate::svd::restriction::generate(&r.restriction, r.size as u32 * 8)?; + crate::svd::restriction::generate(&r.restriction, u32::try_from(r.size).unwrap() * 8)?; let register = svd_rs::RegisterInfo::builder() .name(r.name.clone()) @@ -11,9 +11,9 @@ pub fn generate(r: &chip::Register, base: u32) -> crate::Result ( + chip::ValueRestriction::Range(lo, hi) => ( Some(svd_rs::WriteConstraint::Range( svd_rs::WriteConstraintRange { min: *lo, max: *hi }, )), vec![], ), - chip::ValueRestriction::Enumerated(ref v) => { + chip::ValueRestriction::Enumerated(v) => { let mut values = v.values().collect::>(); values.sort_by(|a, b| a.value.cmp(&b.value)); diff --git a/src/util.rs b/src/util.rs index dc1b7cb..656e442 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,6 +1,7 @@ use std::mem; /// Parse an integer from either decimal or hexadecimal +#[expect(clippy::from_str_radix_10)] pub fn parse_int(s: &str) -> crate::Result { if let Some(hex) = s.strip_prefix("0x") { usize::from_str_radix(hex, 16)