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 |
#1513 in Procedural macros
117 downloads per month
Used in 2 crates
(via lombokrs_codegen)
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