[−][src]Derive Macro macro_input::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,StringorVec<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)]
paths get converted to lower_snake unless rename is specified
use #[macro_input] for customization:
renameto rename either the path or field name eg#[macro_input(rename = "some_name")]default_valuefor default values eg#[macro_input(default_value = "some literal")]
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 });