From 5c645fc75792d5e2bf0b0ec4d67f3099be0f005a Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Sat, 23 Mar 2024 02:01:10 -0500 Subject: [PATCH] Disallow duplicated version requirements Signed-off-by: Christian Poveda --- cyclonedx-bom-macros/src/lib.rs | 12 +++++++++++- .../tests/ui/fail/duplicated_versioned.rs | 10 ++++++++++ .../tests/ui/fail/duplicated_versioned.stderr | 5 +++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.rs create mode 100644 cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.stderr diff --git a/cyclonedx-bom-macros/src/lib.rs b/cyclonedx-bom-macros/src/lib.rs index 562d0f41..f6d3dcf8 100644 --- a/cyclonedx-bom-macros/src/lib.rs +++ b/cyclonedx-bom-macros/src/lib.rs @@ -8,6 +8,7 @@ use syn::{ fold::{self, Fold}, parse_quote, punctuated::Punctuated, + spanned::Spanned, token::Comma, Error, Expr, Item, }; @@ -79,7 +80,16 @@ impl VersionFilter { if path.is_ident("versioned") { match attr.parse_args::() { - Ok(version) => opt_version = Some(version), + Ok(version) => { + if opt_version.is_some() { + self.error = Some(syn::Error::new( + attr.span(), + "found duplicated version requirement", + )) + } else { + opt_version = Some(version); + } + } Err(err) => self.error = Some(err), } diff --git a/cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.rs b/cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.rs new file mode 100644 index 00000000..982d5d8c --- /dev/null +++ b/cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.rs @@ -0,0 +1,10 @@ +use cyclonedx_bom_macros::versioned; + +#[versioned("1.0", "2.0")] +mod base { + #[versioned("1.0")] + #[versioned("2.0")] + struct Foo; +} + +fn main() {} diff --git a/cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.stderr b/cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.stderr new file mode 100644 index 00000000..d0ea4664 --- /dev/null +++ b/cyclonedx-bom-macros/tests/ui/fail/duplicated_versioned.stderr @@ -0,0 +1,5 @@ +error: found duplicated version requirement while using the `#[versioned]` macro + --> tests/ui/fail/duplicated_versioned.rs:6:5 + | +6 | #[versioned("2.0")] + | ^