[−][src]Derive Macro macro_input_macros::MacroInput
#[derive(MacroInput)] { // Attributes available to this derive: #[macro_input] }
automatically derive TryFrom<&[syn::Attribute]>
and fn strip(attrs: &mut Vec<syn::Attribute>)
supported types:
u8
,i32
,f32
,char
,bool
,String
orVec<u8>
for parsing literals eg#[foo(bar = 3)]
Option<u8>
,Option<i32>
,Option<f32>
,Option<char>
,Option<bool>
,Option<String>
orOption<Vec<u8>>
for optionally parsing literals eg either#[foo(bar = 3)]
or nothingOption<()>
for parsing flags eg#[foo(bar)]
Vec<Ident>
andOption<Vec<Ident>>
for parsing idents eg#[foo(bar(baz, qux))]
paths get converted to lower_snake unless rename
is specified
use #[macro_input]
for customization:
rename
to rename either the path or field name eg#[macro_input(rename = "some_name")]
default_value
for default values eg#[macro_input(default_value = "some literal")]
(this is not supported for idents)
Example
use macro_input_macros::MacroInput; use std::convert::TryFrom; use syn::{parse_quote, Attribute}; #[derive(MacroInput, PartialEq, Debug)] pub struct SomeInput { pub flag: Option<()>, pub optional: Option<i32>, #[macro_input(default_value = 3)] pub with_default: i32, pub required: i32, } #[derive(MacroInput, PartialEq, Debug)] #[macro_input(rename = "YetAnotherName")] pub struct OtherInput { #[macro_input(rename = "new_name")] pub renamed: i32, } // construct some attributes let attr1: Attribute = parse_quote!(#[some_input(flag, required = 5)]); let attr2: Attribute = parse_quote!(#[some_input(optional = 8, with_default = 4)]); let attr3: Attribute = parse_quote!(#[YetAnotherName(new_name = 6)]); // parse SomeInput with only some attributes let input1 = SomeInput::try_from(&[attr1.clone()] as &[Attribute])?; // parse SomeInput with all attributes let input2 = SomeInput::try_from(&[attr1, attr2] as &[Attribute])?; // parse OtherInput let input3 = OtherInput::try_from(&[attr3] as &[Attribute])?; assert_eq!(input1, SomeInput { flag: Some(()), optional: None, with_default: 3, required: 5 }); assert_eq!(input2, SomeInput { flag: Some(()), optional: Some(8), with_default: 4, required: 5 }); assert_eq!(input3, OtherInput { renamed: 6 });