5个不稳定版本
0.3.0 | 2024年7月28日 |
---|---|
0.2.0 | 2024年7月28日 |
0.1.2 | 2024年7月27日 |
0.1.1 | 2024年7月27日 |
0.1.0 | 2024年7月27日 |
在进程宏中排名657
每月下载量321次
在2个crate中使用(通过lombokrs_codegen)
26KB
303 行
synext
为syn crate提供一个简单的扩展库,帮助开发者快速开发派生宏
1. 致谢
此项目synext
是在开源项目proc_macros的巨大启发下开发的。特别感谢proc_macros的贡献者,他们的出色工作。
2. 使用方法
将以下内容添加到你的Cargo.toml
[dependencies]
synext = "0.2"
3. API
3.1.字段
3.1.1. named
// input = TokenStream
let derive_input = try_derive_input(input);
let named_fields = try_parse_named_fields( & derive_input);
3.1.2. unnamed
// input = TokenStream
let derive_input = try_derive_input(input);
let unnamed_fields = try_parse_unnamed_fields( & derive_input);
3.1.3. match
// input = TokenStream
let derive_input = try_derive_input(input);
let fields = try_match_fields( & derive_input);
3.2. 类型
3.2.1. Option
unwrap Option
内部类型。
pub fn try_unwrap_option(ty: &Type) -> &Type { ... }
3.2.2. Vec
unwrap Vec
内部类型。
pub fn try_unwrap_vec(ty: &Type) -> &Type { ... }
3.2.3. unwrap_types
pub fn try_unwrap_types<'a>(ident: &str, target_types: usize, ty: &'a Type) -> Option<Vec<&'a Type>> { ... }
3.2.4. inner_types
pub fn try_extract_inner_types(ty: &Type) -> Option<Vec<&Type>> { ... }
3.3. 谓词
-
Option
-
pub fn try_predicate_is_option(ty: &Type) -> bool { ... } // @since 0.2.0 pub fn try_predicate_is_not_option(ty: &Type) -> bool { ... }
-
-
Vec
-
pub fn try_predicate_is_vec(ty: &Type) -> bool { ... } // @since 0.2.0 pub fn try_predicate_is_not_vec(ty: &Type) -> bool { ... }
-
-
Ident
-
pub fn try_predicate_is_ident(ident: &str, path: &Path) -> bool { ... } pub fn try_predicate_is_not_ident(ident: &str, path: &Path) -> bool { ... }
-
-
segments
-
pub fn try_predicate_path_segments_is_not_empty(path: &Path) -> bool { ... } pub fn try_predicate_path_segments_is_empty(path: &Path) -> bool { ... }
-
3.4.派生属性
尝试从字段的属性中提取指定的路径属性值。
// @since 0.2.0
pub fn try_extract_field_attribute_path_attribute(...) -> syn::Result<Option<syn::Ident>> { ... }
3.5.属性宏
3.5.1.kv
extern crate proc_macro;
use proc_macro::TokenStream;
use std::sync::Arc;
#[proc_macro_attribute]
pub fn component(args: TokenStream, item: TokenStream) -> TokenStream {
// ...
}
pub struct HelloService {
// ...
}
#[component(value = "helloController")] // kv
pub struct HelloController {
hello_service: Arc<HelloService>,
}
->
try_extract_attribute_args("value", args);
3.5.2.first
extern crate proc_macro;
use proc_macro::TokenStream;
use std::sync::Arc;
#[proc_macro_attribute]
pub fn component(args: TokenStream, item: TokenStream) -> TokenStream {
// ...
}
pub struct HelloService {
// ...
}
#[component("helloController")] // first
pub struct HelloController {
hello_service: Arc<HelloService>,
}
->
try_extract_attribute_first_args(args);
依赖项
~1.5MB
~35K SLoC