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, ()])]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
There are multiple ways of parsing a struct deriving Attribute.
For helper attributes there is:
- Attribute::from_attributeswhich takes in an- IntoIterator<Item = &'a syn::Attribute(e.g. a- &Vec<syn::Attribute>). Most useful for derive macros.
- Attribute::remove_attributeswhich takes an- &mut Vec<syn::Attribute>and does not only parse the- Attributebut also removes those matching. Useful for helper attributes for proc macros, where the helper attributes need to be removed.
For parsing a single TokenStream e.g. for parsing the proc macro input there a two ways:
- Attribute::from_argstaking in a- TokenStream
- As derive(Attribute)also derivesParseso you can use the parse API, e.g. withparse_macro_input!(tokens as Attribute).