17 unstable releases (8 breaking)

0.9.2 Jun 22, 2024
0.9.1 Mar 23, 2024
0.8.1 Sep 27, 2023
0.6.1 May 21, 2023
0.2.2 Feb 12, 2022

#28 in Procedural macros

Download history 59225/week @ 2024-04-05 67512/week @ 2024-04-12 63978/week @ 2024-04-19 61716/week @ 2024-04-26 65035/week @ 2024-05-03 70578/week @ 2024-05-10 71112/week @ 2024-05-17 76396/week @ 2024-05-24 89873/week @ 2024-05-31 88480/week @ 2024-06-07 75102/week @ 2024-06-14 80395/week @ 2024-06-21 84890/week @ 2024-06-28 84875/week @ 2024-07-05 90422/week @ 2024-07-12 67552/week @ 2024-07-19

351,074 downloads per month
Used in 237 crates (18 directly)

MIT/Apache

66KB
1K SLoC

attribute-derive

docs.rs lib.rs MIT Documentation for main

Basically clap for attribute macros:

use attribute_derive::Attribute;
use syn::Type;

#[derive(Attribute)]
#[attribute(ident = collection)]
#[attribute(error(missing_field = "`{field}` was not specified"))]
struct CollectionAttribute {
    // Options are optional by default (will be set to None if not specified)
    authority: Option<String>,
    name: String,
    // Any type implementing default can be flagged as default
    // This will be set to Vec::default() when not specified
    #[attribute(optional)]
    views: Vec<Type>,
    // Booleans can be used without assigning a value, i.e., as a flag.
    // If omitted they are set to false
    some_flag: bool,
}

Will be able to parse an attribute like this:

#[collection(authority="Some String", name = r#"Another string"#, views = [Option, ()])]

Limitations

There are some limitations in syntax parsing that will be lifted future releases.

  • literals in top level (meaning something like #[attr(42, 3.14, "hi")]
  • function like arguments (something like #[attr(view(a = "test"))]
  • other syntaxes, maybe something like key: value

Parse methods

There are multiple ways of parsing a struct deriving Attribute.

For helper attributes there is:

For parsing a single TokenStream e.g. for parsing the proc macro input there a two ways:

Dependencies

~0.7–1.2MB
~25K SLoC