9个版本
0.1.7 | 2021年12月5日 |
---|---|
0.1.6 | 2020年8月30日 |
0.1.5 | 2020年7月11日 |
0.1.4 | 2020年3月4日 |
0.0.1 | 2019年11月28日 |
#451 in 进程宏
46,352 每月下载量
在 71 个 crates(直接使用10个)中使用
14KB
237 行
bae
bae
是一个针对进程宏作者的crate,它简化了属性的解析。它深受 darling
启发,但API简单得多。
有关更多信息,请参阅 文档。
lib.rs
:
bae
是一个针对进程宏作者的crate,它简化了属性的解析。它深受 darling
启发,但API简单得多。
use bae::FromAttributes;
#[derive(
Debug,
Eq,
PartialEq,
// This will add two functions:
// ```
// fn from_attributes(attrs: &[syn::Attribute]) -> Result<MyAttr, syn::Error>
// fn try_from_attributes(attrs: &[syn::Attribute]) -> Result<Option<MyAttr>, syn::Error>
// ```
//
// `try_from_attributes` returns `Ok(None)` if the attribute is missing, `Ok(Some(_))` if
// its there and is valid, `Err(_)` otherwise.
FromAttributes,
)]
pub struct MyAttr {
// Anything that implements `syn::parse::Parse` is supported.
mandatory_type: syn::Type,
mandatory_ident: syn::Ident,
// Fields wrapped in `Option` are optional and default to `None` if
// not specified in the attribute.
optional_missing: Option<syn::Type>,
optional_given: Option<syn::Type>,
// A "switch" is something that doesn't take arguments.
// All fields with type `Option<()>` are considered swiches.
// They default to `None`.
switch: Option<()>,
}
// `MyAttr` is now equipped to parse attributes named `my_attr`. For example:
//
// #[my_attr(
// switch,
// mandatory_ident = foo,
// mandatory_type = SomeType,
// optional_given = OtherType,
// )]
// struct Foo {
// ...
// }
// the input and output type would normally be `proc_macro::TokenStream` but those
// types cannot be used outside the compiler itself.
fn my_proc_macro(input: proc_macro2::TokenStream) -> proc_macro2::TokenStream {
let item_struct = syn::parse2::<syn::ItemStruct>(input).unwrap();
let my_attr = MyAttr::from_attributes(&item_struct.attrs).unwrap();
assert_eq!(
my_attr.mandatory_type,
syn::parse_str::<syn::Type>("SomeType").unwrap()
);
assert_eq!(my_attr.optional_missing, None);
assert_eq!(
my_attr.optional_given,
Some(syn::parse_str::<syn::Type>("OtherType").unwrap())
);
assert_eq!(my_attr.mandatory_ident, syn::parse_str::<syn::Ident>("foo").unwrap());
assert_eq!(my_attr.switch.is_some(), true);
// ...
#
# quote::quote! {}
}
#
依赖关系
~2MB
~44K SLoC