#syn #macro-derive #macro #attributes #extension #quickly #help

synext

为syn crate提供的一个简单扩展库,帮助开发者快速开发派生宏

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

Download history 112/week @ 2024-07-21 207/week @ 2024-07-28 2/week @ 2024-08-04

每月下载量321
2个crate中使用(通过lombokrs_codegen

Apache-2.0

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