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

synext

A simple extension library for syn crate to help developers quickly develop derive macros

5 unstable releases

0.3.0 Jul 28, 2024
0.2.0 Jul 28, 2024
0.1.2 Jul 27, 2024
0.1.1 Jul 27, 2024
0.1.0 Jul 27, 2024

#1525 in Procedural macros

Download history 314/week @ 2024-07-27 7/week @ 2024-08-03 9/week @ 2024-09-14 4/week @ 2024-09-21 25/week @ 2024-09-28

117 downloads per month
Used in 2 crates (via lombokrs_codegen)

Apache-2.0

26KB
303 lines

synext

A simple extension library for syn crate to help developers quickly develop derive macros

1. Acknowledgment

This project, synext, was developed with significant inspiration from the open-source project proc_macros. Special thanks to the contributors of proc_macros for their excellent work.

2. Usage

Add this to your Cargo.toml:

[dependencies]
synext = "0.2"

3. APIs

3.1.Fields

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. Types

3.2.1. Option

unwrap Option inner type.

pub fn try_unwrap_option(ty: &Type) -> &Type { ... }

3.2.2. Vec

unwrap Vec inner type.

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. Predicate

  • 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.Derive attribute

Try to extract the specified path attribute value from a field's attributes.

// @since 0.2.0
pub fn try_extract_field_attribute_path_attribute(...) -> syn::Result<Option<syn::Ident>> { ... }

3.5.Attribute macro

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);

Dependencies

~1.5MB
~37K SLoC