From be8e477ecc6b24b1c0f0474c2f714985e83be8c5 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Thu, 20 Nov 2025 01:04:04 +0300 Subject: [PATCH] Added ability to specify char type in 'parser_fn_decl!' --- src/macros/parser_fn_decl.rs | 110 ++++++++++++++++++++++++----------- 1 file changed, 76 insertions(+), 34 deletions(-) diff --git a/src/macros/parser_fn_decl.rs b/src/macros/parser_fn_decl.rs index 96f0a40..3d5d6ed 100644 --- a/src/macros/parser_fn_decl.rs +++ b/src/macros/parser_fn_decl.rs @@ -1,87 +1,129 @@ #[macro_export] macro_rules! parser_fn_decl { - // only type generics | default src type ------------------------------------------------------- + // unknown char type | custom src type --------------------------------------------------------- ( $scope:vis fn $name:ident - $(< - $generic0Name:ident $(: $generic0Bound:path)? - $(, $genericNName:ident $(: $genericNBound:path)?)* $(,)? - >)? - ($srcName:ident : $srcType:ty $(, $argNName:ident : $argNType:ty)* $(,)?) + < + C=? + $(, $lifetimeName:lifetime)* + $(, $genericName:ident $(: $genericBound:path)?)* + $(,)? + > + ( + $srcName:ident : $srcType:ty + $(, $argName:ident : $argType:ty)* + $(,)? + ) $(-> $ret:ty)? $body:block ) => { $scope fn $name < - 'source, 'pos, P:Pos<'pos>, CS:CollectedSubstring<'source> - $(, $generic0Name $(: $generic0Bound)? $(, $genericNName $(: $genericNBound)?)* )? + 'source, 'pos, + $( $lifetimeName, )* + C:Copy, P:Pos<'pos>, CS:CollectedSubstring<'source, C=C> + $(, $genericName $(: $genericBound)?)* > - ($srcName: $srcType $(, $argNName : $argNType)*) + ( + $srcName: $srcType + $(, $argName : $argType)* + ) $(-> $ret)? $body }; - // lifetime + type generics | default src type -------------------------------------------------- + // explicit char type | custom src type --------------------------------------------------------- ( $scope:vis fn $name:ident < - $lifetime0Name:lifetime $(, $lifetimeNName:lifetime)* - $(, $genericNName:ident $(: $genericNBound:path)?)* $(,)? + C=$charType:ty + $(, $lifetimeName:lifetime)* + $(, $genericName:ident $(: $genericBound:path)?)* + $(,)? > - ($srcName:ident : $srcType:ty $(, $argNName:ident : $argNType:ty)* $(,)?) + ( + $srcName:ident : $srcType:ty + $(, $argName:ident : $argType:ty)* + $(,)? + ) $(-> $ret:ty)? $body:block ) => { $scope fn $name < - 'source, 'pos, $lifetime0Name $(, $lifetimeNName)*, - P: Pos<'pos>, CS: CollectedSubstring<'source> - $(, $genericNName $(: $genericNBound)?)* + 'source, 'pos, + $( $lifetimeName, )* + P:Pos<'pos>, CS:CollectedSubstring<'source, C=$charType> + $(, $genericName $(: $genericBound)?)* > - ($srcName: $srcType $(, $argNName : $argNType)*) + ( + $srcName: $srcType + $(, $argName : $argType)* + ) $(-> $ret)? $body }; - // only type generics | custom src type -------------------------------------------------------- + // unknown char type | default src type -------------------------------------------------------- ( $scope:vis fn $name:ident - $(< - $generic0Name:ident $(: $generic0Bound:path)? - $(, $genericNName:ident $(: $genericNBound:path)?)* $(,)? - >)? - ($srcName:ident $(, $argNName:ident : $argNType:ty)* $(,)?) + < + C=? + $(, $lifetimeName:lifetime)* + $(, $genericName:ident $(: $genericBound:path)?)* + $(,)? + > + ( + $srcName:ident + $(, $argName:ident : $argType:ty)* + $(,)? + ) $(-> $ret:ty)? $body:block ) => { $scope fn $name < - 'source, 'pos, P:Pos<'pos>, CS:CollectedSubstring<'source> - $(, $generic0Name $(: $generic0Bound)? $(, $genericNName $(: $genericNBound)?)* )? + 'source, 'pos, + $( $lifetimeName, )* + C:Copy, P:Pos<'pos>, CS:CollectedSubstring<'source, C=C> + $(, $genericName $(: $genericBound)?)* > - ($srcName: &'source mut impl SourceStream<'source, 'pos, P=P, CS=CS> $(, $argNName : $argNType)*) + ( + $srcName: &'source mut impl SourceStream<'source, 'pos, C=C, P=P, CS=CS> + $(, $argName : $argType)* + ) $(-> $ret)? $body }; - // lifetime + type generics | custom src type -------------------------------------------------- + // explicit char type | default src type ------------------------------------------------------- ( $scope:vis fn $name:ident < - $lifetime0Name:lifetime $(, $lifetimeNName:lifetime)* - $(, $genericNName:ident $(: $genericNBound:path)?)* $(,)? + C=$charType:ty + $(, $lifetimeName:lifetime)* + $(, $genericName:ident $(: $genericBound:path)?)* + $(,)? > - ($srcName:ident $(, $argNName:ident : $argNType:ty)* $(,)?) + ( + $srcName:ident + $(, $argName:ident : $argType:ty)* + $(,)? + ) $(-> $ret:ty)? $body:block ) => { $scope fn $name < - 'source, 'pos, $lifetime0Name $(, $lifetimeNName)*, - P: Pos<'pos>, CS: CollectedSubstring<'source> - $(, $genericNName $(: $genericNBound)?)* + 'source, 'pos, + $( $lifetimeName, )* + P:Pos<'pos>, CS:CollectedSubstring<'source, C=$charType> + $(, $genericName $(: $genericBound)?)* > - ($srcName: &'source mut impl SourceStream<'source, 'pos, P=P, CS=CS> $(, $argNName : $argNType)*) + ( + $srcName: &'source mut impl SourceStream<'source, 'pos, C=$charType, P=P, CS=CS> + $(, $argName : $argType)* + ) $(-> $ret)? $body };