diff --git a/safe-discriminant-derive/Cargo.toml b/safe-discriminant-derive/Cargo.toml index d6fa27d..c3b90e9 100644 --- a/safe-discriminant-derive/Cargo.toml +++ b/safe-discriminant-derive/Cargo.toml @@ -6,7 +6,7 @@ readme = "../Readme.md" license = "BSD-3-Clause" keywords = ["no_std", "enums"] description = """A minimalistic, `no_std` compatible trait and procedural macro \ - for extracting discriminants from enums at zero cost."""" + for extracting discriminants from enums at zero cost.""" documentation = "https://docs.rs/safe_discriminant_derive" homepage = "https://docs.rs/safe_discriminant" repository = "https://github.com/oddcoder/safe-discriminant" diff --git a/safe-discriminant-derive/src/lib.rs b/safe-discriminant-derive/src/lib.rs index 67a4d03..9adcc9a 100644 --- a/safe-discriminant-derive/src/lib.rs +++ b/safe-discriminant-derive/src/lib.rs @@ -155,3 +155,12 @@ pub fn repr(_: TokenStream, item: TokenStream) -> TokenStream { pub fn do_nothing(_: TokenStream, item: TokenStream) -> TokenStream { item } + +#[cfg(feature = "test-utils")] +/// This macro will remove the discriminant of any enum field it is applied to +#[proc_macro_attribute] +pub fn remove_disc(_: TokenStream, item: TokenStream) -> TokenStream { + let mut variant = parse_macro_input!(item as Variant); + variant.discriminant = None; + quote!(#variant).into() +} diff --git a/safe-discriminant/tests/fail/remove_disc.rs b/safe-discriminant/tests/fail/remove_disc.rs new file mode 100644 index 0000000..a7d211b --- /dev/null +++ b/safe-discriminant/tests/fail/remove_disc.rs @@ -0,0 +1,11 @@ +use safe_discriminant::Discriminant; +use safe_discriminant_derive::remove_disc; +#[derive(Discriminant)] +#[repr(u8)] +pub enum Foo { + #[remove_disc] + A = 0, + B = 1, +} + +fn main() {} diff --git a/safe-discriminant/tests/fail/remove_disc.stderr b/safe-discriminant/tests/fail/remove_disc.stderr new file mode 100644 index 0000000..aeb117a --- /dev/null +++ b/safe-discriminant/tests/fail/remove_disc.stderr @@ -0,0 +1,5 @@ +error: expected non-macro attribute, found attribute macro `remove_disc` + --> tests/fail/remove_disc.rs:6:7 + | +6 | #[remove_disc] + | ^^^^^^^^^^^ not a non-macro attribute