Module attr_prop

Source
Expand description

Attribute’s properties. Reuse them to define how to parse properties of an attribute.

§Example

use macro_tools::AttributePropertyBoolean;

#[ derive( Debug, Default, Clone, Copy ) ]
pub struct DebugMarker;

#[ derive( Debug, Default, Clone, Copy ) ]
pub struct EnabledMarker;

pub trait AttributePropertyComponent
{
  const KEYWORD : &'static str;
}

impl AttributePropertyComponent for DebugMarker
{
  const KEYWORD : &'static str = "debug";
}

impl AttributePropertyComponent for EnabledMarker
{
  const KEYWORD : &'static str = "enabled";
}

#[ derive( Debug, Default ) ]
struct MyAttributes
{
  pub debug : AttributePropertyBoolean< DebugMarker >,
  pub enabled : AttributePropertyBoolean< EnabledMarker >,
}

impl syn::parse::Parse for MyAttributes
{
  fn parse( input : syn::parse::ParseStream< '_ > ) -> syn::Result< Self >
  {
    let mut debug = AttributePropertyBoolean::< DebugMarker >::default();
    let mut enabled = AttributePropertyBoolean::< EnabledMarker >::default();

    while !input.is_empty()
    {
      let lookahead = input.lookahead1();
      if lookahead.peek( syn::Ident )
      {
        let ident : syn::Ident = input.parse()?;
        match ident.to_string().as_str()
        {
          DebugMarker::KEYWORD => debug = input.parse()?,
          EnabledMarker::KEYWORD => enabled = input.parse()?,
          _ => return Err( lookahead.error() ),
        }
      }
      else
      {
        return Err( lookahead.error() );
      }

      // Optional comma handling
      if input.peek( syn::Token![,] )
      {
        input.parse::< syn::Token![,] >()?;
      }
    }

    Ok( MyAttributes { debug, enabled } )
  }
}

let input : syn::Attribute = syn::parse_quote!( #[ attribute( enabled = true ) ] );
let meta = match input.meta
{
  syn::Meta::List( meta_list ) => meta_list,
  _ => panic!( "Expected a Meta::List" ),
};

let nested_meta_stream : proc_macro2::TokenStream = meta.tokens;
let attrs : MyAttributes = syn::parse2( nested_meta_stream ).unwrap();
println!( "{:?}", attrs );

In this example, the AttributePropertyBoolean struct is used to define attributes with boolean properties. The DebugMarker and EnabledMarker structs act as markers to distinguish between different boolean attributes. The MyAttributes struct aggregates these boolean attributes.

The Parse implementation for MyAttributes iterates through the attribute’s key-value pairs, identifying each by its marker’s keyword and parsing the boolean value. It uses the ParseStream to parse identifiers and their associated values, matching them to the appropriate marker’s keyword. If an unrecognized identifier is encountered, it returns an error.

The parse_quote! macro is used to create a syn::Attribute instance with the attribute syntax, which is then parsed into the MyAttributes struct. The resulting MyAttributes instance is printed to the console.

Re-exports§

pub use super::super::attr_prop;

Modules§

exposed
Exposed namespace of the module.
orphan
Orphan namespace of the module.
own
Own namespace of the module.
prelude
Prelude to use essentials: use my_module::prelude::*.

Structs§

AttributePropertyBoolean
A generic boolean attribute property. Defaults to false.
AttributePropertyBooleanMarker
Default marker for AttributePropertyBoolean. Used if no marker is defined as parameter.
AttributePropertyOptionalBoolean
A generic optional boolean attribute property: Option< bool >. Defaults to false.
AttributePropertyOptionalBooleanMarker
Default marker for AttributePropertyOptionalSingletone. Used if no marker is defined as parameter.
AttributePropertyOptionalSingletone
A generic attribute property for switching on/off. Has 3 states: None, Some( true ), Some( false ). Defaults to None.
AttributePropertyOptionalSingletoneMarker
Default marker for AttributePropertyOptionalSingletone. Used if no marker is defined as parameter.
AttributePropertyOptionalSyn
Property of an attribute which simply wraps one of the standard syn types and keeps it optional.
AttributePropertyOptionalSynMarker
Default marker for AttributePropertyOptionalSyn. Used if no marker is defined as parameter.
AttributePropertySingletone
A generic boolean attribute property which consists of only keyword. This property can have two states: true, or false. Defaults to false.
AttributePropertySingletoneMarker
Default marker for AttributePropertySingletone. Used if no marker is defined as parameter.
AttributePropertySyn
Property of an attribute which simply wraps one of the standard syn types.
AttributePropertySynMarker
Default marker for AttributePropertySyn. Used if no marker is defined as parameter.

Traits§

AttributePropertyComponent
Trait for properties of an attribute component that can be identified by a keyword.