From 9720309976fa52e62c195ea6135eec68edb687fb Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sat, 15 Nov 2025 23:04:19 +0300 Subject: [PATCH] Making generic constraints in macros optional and added visibility parameter --- src/macros/builder_trait_decl.rs | 17 ++++---- src/macros/mod.rs | 2 +- .../{parser_func.rs => parser_func_decl.rs} | 42 +++++++++++-------- 3 files changed, 34 insertions(+), 27 deletions(-) rename src/macros/{parser_func.rs => parser_func_decl.rs} (57%) diff --git a/src/macros/builder_trait_decl.rs b/src/macros/builder_trait_decl.rs index 209a84f..01aae6d 100644 --- a/src/macros/builder_trait_decl.rs +++ b/src/macros/builder_trait_decl.rs @@ -1,35 +1,36 @@ #[macro_export] macro_rules! builder_trait_decl { ( - $name:ident + $scope:vis $name:ident $(< - $generic0Name:ident : $generic0Bound:path $(, $genericNName:ident : $genericNBound:path)* + $generic0Name:ident $(: $generic0Bound:path)? $(, $genericNName:ident $(: $genericNBound:path)?)* >)? $(: $base0:path $(, $baseN:path)*)? { $($body:tt)* } ) => { - trait $name + $scope trait $name < 'source, 'pos, 'builder, C, P:Pos<'pos>, CS:CollectedSubstring<'source, C> - $(, $generic0Name : $generic0Bound $(, $genericNName : $genericNBound)* )? + $(, $generic0Name $(: $generic0Bound)? $(, $genericNName $(: $genericNBound)?)* )? > $(: $base0 $(, $baseN)*)? { $($body)* } }; + ( - $name:ident + $scope:vis $name:ident < $lifetime0Name:lifetime $(, $lifetimeNName:lifetime)* - $(, $genericNName:ident : $genericNBound:path)* + $(, $genericNName:ident $(: $genericNBound:path)?)* > $(: $base0:path $(, $baseN:path)*)? { $($body:tt)* } ) => { - fn $name + $scope trait $name < 'source, 'pos, 'builder, $lifetime0Name $(, $lifetimeNName)*, C, P: Pos<'pos>, CS: CollectedSubstring<'source, C> - $(, $genericNName : $genericNBound)* + $(, $genericNName $(: $genericNBound)?)* > $(: $base0 $(, $baseN)*)? { $($body)* } diff --git a/src/macros/mod.rs b/src/macros/mod.rs index c69c43d..9643e7e 100644 --- a/src/macros/mod.rs +++ b/src/macros/mod.rs @@ -1,3 +1,3 @@ mod builder_type_t; -mod parser_func; +mod parser_func_decl; mod builder_trait_decl; \ No newline at end of file diff --git a/src/macros/parser_func.rs b/src/macros/parser_func_decl.rs similarity index 57% rename from src/macros/parser_func.rs rename to src/macros/parser_func_decl.rs index cfcf3ee..c4c7c71 100644 --- a/src/macros/parser_func.rs +++ b/src/macros/parser_func_decl.rs @@ -1,77 +1,83 @@ #[macro_export] -macro_rules! parser_func { - +macro_rules! parser_func_decl { + // only type generics | default src type ------------------------------------------------------- ( - $name:ident + $scope:vis $name:ident $(< - $generic0Name:ident : $generic0Bound:path $(, $genericNName:ident : $genericNBound:path)* + $generic0Name:ident $(: $generic0Bound:path)? $(, $genericNName:ident $(: $genericNBound:path)?)* >)? ($srcName:ident : $srcType:ty $(, $argNName:ident : $argNType:ty)*) $(-> $ret:ty)? $body:block ) => { - fn $name + $scope fn $name < 'source, 'pos, 'builder, C, P:Pos<'pos>, CS:CollectedSubstring<'source, C> - $(, $generic0Name : $generic0Bound $(, $genericNName : $genericNBound)* )? + $(, $generic0Name $(: $generic0Bound)? $(, $genericNName $(: $genericNBound)?)* )? > ($srcName: $srcType $(, $argNName : $argNType)*) $(-> $ret)? $body }; + + // lifetime + type generics | default src type -------------------------------------------------- ( - $name:ident + $scope:vis $name:ident < $lifetime0Name:lifetime $(, $lifetimeNName:lifetime)* - $(, $genericNName:ident : $genericNBound:path)* + $(, $genericNName:ident $(: $genericNBound:path)?)* > ($srcName:ident : $srcType:ty $(, $argNName:ident : $argNType:ty)*) $(-> $ret:ty)? $body:block ) => { - fn $name + $scope fn $name < 'source, 'pos, 'builder, $lifetime0Name $(, $lifetimeNName)*, C, P: Pos<'pos>, CS: CollectedSubstring<'source, C> - $(, $genericNName : $genericNBound)* + $(, $genericNName $(: $genericNBound)?)* > ($srcName: $srcType $(, $argNName : $argNType)*) $(-> $ret)? $body }; + + // only type generics | custom src type -------------------------------------------------------- ( - $name:ident + $scope:vis $name:ident $(< - $generic0Name:ident : $generic0Bound:path $(, $genericNName:ident : $genericNBound:path)* + $generic0Name:ident $(: $generic0Bound:path)? $(, $genericNName:ident $(: $genericNBound:path)?)* >)? ($srcName:ident $(, $argNName:ident : $argNType:ty)*) $(-> $ret:ty)? $body:block ) => { - fn $name + $scope fn $name < 'source, 'pos, 'builder, C, P:Pos<'pos>, CS:CollectedSubstring<'source, C> - $(, $generic0Name : $generic0Bound $(, $genericNName : $genericNBound)* )? + $(, $generic0Name $(: $generic0Bound)? $(, $genericNName $(: $genericNBound)?)* )? > ($srcName: &'source mut impl SourceStream<'source, 'pos, C, P, CS> $(, $argNName : $argNType)*) $(-> $ret)? $body }; + + // lifetime + type generics | custom src type -------------------------------------------------- ( - $name:ident + $scope:vis $name:ident < $lifetime0Name:lifetime $(, $lifetimeNName:lifetime)* - $(, $genericNName:ident : $genericNBound:path)* + $(, $genericNName:ident $(: $genericNBound:path)?)* > ($srcName:ident $(, $argNName:ident : $argNType:ty)*) $(-> $ret:ty)? $body:block ) => { - fn $name + $scope fn $name < 'source, 'pos, 'builder, $lifetime0Name $(, $lifetimeNName)*, C, P: Pos<'pos>, CS: CollectedSubstring<'source, C> - $(, $genericNName : $genericNBound)* + $(, $genericNName $(: $genericNBound)?)* > ($srcName: &'source mut impl SourceStream<'source, 'pos, C, P, CS> $(, $argNName : $argNType)*) $(-> $ret)?