#[derive(MacroInput)]
{
// Attributes available to this derive:
#[macro_input]
}
Expand description
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 });