diff --git a/src/lib.rs b/src/lib.rs index e35b668..a669efb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ mod _keyword_impls; +mod parser_func; pub trait Predicate { fn check(&mut self, chr: C) -> bool; diff --git a/src/parser_func.rs b/src/parser_func.rs new file mode 100644 index 0000000..cfcf3ee --- /dev/null +++ b/src/parser_func.rs @@ -0,0 +1,80 @@ +#[macro_export] +macro_rules! parser_func { + + ( + $name:ident + $(< + $generic0Name:ident : $generic0Bound:path $(, $genericNName:ident : $genericNBound:path)* + >)? + ($srcName:ident : $srcType:ty $(, $argNName:ident : $argNType:ty)*) + $(-> $ret:ty)? + $body:block + ) => { + fn $name + < + 'source, 'pos, 'builder, C, P:Pos<'pos>, CS:CollectedSubstring<'source, C> + $(, $generic0Name : $generic0Bound $(, $genericNName : $genericNBound)* )? + > + ($srcName: $srcType $(, $argNName : $argNType)*) + $(-> $ret)? + $body + }; + ( + $name:ident + < + $lifetime0Name:lifetime $(, $lifetimeNName:lifetime)* + $(, $genericNName:ident : $genericNBound:path)* + > + ($srcName:ident : $srcType:ty $(, $argNName:ident : $argNType:ty)*) + $(-> $ret:ty)? + $body:block + ) => { + fn $name + < + 'source, 'pos, 'builder, $lifetime0Name $(, $lifetimeNName)*, + C, P: Pos<'pos>, CS: CollectedSubstring<'source, C> + $(, $genericNName : $genericNBound)* + > + ($srcName: $srcType $(, $argNName : $argNType)*) + $(-> $ret)? + $body + }; + ( + $name:ident + $(< + $generic0Name:ident : $generic0Bound:path $(, $genericNName:ident : $genericNBound:path)* + >)? + ($srcName:ident $(, $argNName:ident : $argNType:ty)*) + $(-> $ret:ty)? + $body:block + ) => { + fn $name + < + 'source, 'pos, 'builder, C, P:Pos<'pos>, CS:CollectedSubstring<'source, C> + $(, $generic0Name : $generic0Bound $(, $genericNName : $genericNBound)* )? + > + ($srcName: &'source mut impl SourceStream<'source, 'pos, C, P, CS> $(, $argNName : $argNType)*) + $(-> $ret)? + $body + }; + ( + $name:ident + < + $lifetime0Name:lifetime $(, $lifetimeNName:lifetime)* + $(, $genericNName:ident : $genericNBound:path)* + > + ($srcName:ident $(, $argNName:ident : $argNType:ty)*) + $(-> $ret:ty)? + $body:block + ) => { + fn $name + < + 'source, 'pos, 'builder, $lifetime0Name $(, $lifetimeNName)*, + C, P: Pos<'pos>, CS: CollectedSubstring<'source, C> + $(, $genericNName : $genericNBound)* + > + ($srcName: &'source mut impl SourceStream<'source, 'pos, C, P, CS> $(, $argNName : $argNType)*) + $(-> $ret)? + $body + }; +}