#[macro_export]
macro_rules! parse_type {
{
$caller:tt
input = [{ $($tt:tt)* }]
} => {
$crate::private_parse_type! {
$caller
tokens = [{ $($tt)* }]
_tokens = [{ $($tt)* }]
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_parse_type_with_plus {
{
$caller:tt
input = [{ $($input:tt)* }]
} => {
$crate::private_parse_type_with_plus! {
$caller
pieces = [{ }]
tokens = [{ $($input)* }]
}
};
{
$caller:tt
pieces = [{ $($pieces:tt)+ }]
tokens = [{ $lifetime:lifetime $($rest:tt)* }]
} => {
$crate::private_parse_type_with_plus! {
$caller
pieces = [{ $($pieces)* }]
type = [{ $lifetime }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
pieces = [{ $($pieces:tt)* }]
tokens = [{ $($tokens:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($tokens)* }]
~~> $crate::private_parse_type_with_plus! {
$caller
pieces = [{ $($pieces)* }]
}
}
};
{
$caller:tt
pieces = [{ $($pieces:tt)* }]
type = [{ $($ty:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::private_parse_type_with_plus! {
$caller
pieces = [{ $($pieces)* }]
type = [{ $($ty)* }]
rest = [{ $($rest)* }]
_rest = [{ $($rest)* }]
}
};
{
$caller:tt
pieces = [{ $($pieces:tt)* }]
type = [{ $($ty:tt)* }]
rest = [{ + $($rest:tt)* }]
_rest = [{ $plus:tt $($dup:tt)* }]
} => {
$crate::private_parse_type_with_plus! {
$caller
pieces = [{ $($pieces)* $($ty)* $plus }]
tokens = [{ $($rest)* }]
}
};
{
$caller:tt
pieces = [{ $($pieces:tt)* }]
type = [{ $($ty:tt)* }]
rest = [{ $($rest:tt)* }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($pieces)* $($ty)* }]
rest = [{ $($rest)* }]
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_parse_type {
{
$caller:tt
tokens = [{ [$($bracketed:tt)+] $($rest:tt)* }]
_tokens = [{ $original:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_validate_inside_brackets }]
original = [{ $original }]
input = [{ $($bracketed)* }]
~~> $crate::tt_return! {
$caller
type = [{ $original }]
rest = [{ $($rest)* }]
}
}
};
{
$caller:tt
tokens = [{ [] $($rest:tt)* }]
_tokens = [{ $first:tt $($dup:tt)* }]
} => {
$crate::private_unexpected_close_empty_square_brackets! {
$first
}
};
{
$caller:tt
tokens = [{ ($($parenthesized:tt)*) $($rest:tt)* }]
_tokens = [{ $original:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_validate_inside_parens }]
input = [{ $($parenthesized)* }]
~~> $crate::tt_return! {
$caller
type = [{ $original }]
rest = [{ $($rest)* }]
}
}
};
{
$caller:tt
tokens = [{ * $($rest:tt)+ }]
_tokens = [{ $asterisk:tt $($dup:tt)* }]
} => {
$crate::private_parse_pointer! {
$caller
pointer = [{ $asterisk }]
tokens = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ & $($rest:tt)+ }]
_tokens = [{ $ampersand:tt $($dup:tt)* }]
} => {
$crate::private_parse_reference! {
$caller
reference = [{ $ampersand }]
tokens = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ fn $($rest:tt)+ }]
_tokens = [{ $fn:tt $($dup:tt)* }]
} => {
$crate::private_parse_function! {
$caller
function = [{ $fn }]
tokens = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ fn }]
_tokens = [{ $unexpected:tt }]
} => {
$crate::error_unexpected! {
$unexpected
}
};
{
$caller:tt
tokens = [{ ! $($rest:tt)* }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ ! }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ dyn $($rest:tt)+ }]
_tokens = [{ $dyn:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_type_with_plus }]
input = [{ $($rest)* }]
~~> $crate::private_parse_type! {
$caller
object = [{ $dyn }]
}
}
};
{
$caller:tt
tokens = [{ dyn }]
_tokens = [{ $unexpected:tt }]
} => {
$crate::error_unexpected! {
$unexpected
}
};
{
$caller:tt
tokens = [{ impl $($rest:tt)+ }]
_tokens = [{ $impl:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_type_with_plus }]
input = [{ $($rest)* }]
~~> $crate::private_parse_type! {
$caller
object = [{ $impl }]
}
}
};
{
$caller:tt
tokens = [{ impl }]
_tokens = [{ $unexpected:tt }]
} => {
$crate::error_unexpected! {
$unexpected
}
};
{
$caller:tt
object = [{ $kind:ident }]
type = [{ $($element:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $kind $($element)* }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ _ $($rest:tt)* }]
_tokens = [{ $underscore:tt $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $underscore }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ for $($rest:tt)+ }]
_tokens = [{ $for:tt $($dup:tt)* }]
} => {
$crate::private_parse_poly_trait! {
$caller
poly_trait = [{ $for }]
tokens = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ for }]
_tokens = [{ $unexpected:tt }]
} => {
$crate::error_unexpected! {
$unexpected
}
};
{
$caller:tt
tokens = [{ $($path:ident)::+ ! ( $($args:tt)* ) $($rest:tt)* }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($path)::* ! ( $($args)* ) }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ $(:: $path:ident)+ ! ( $($args:tt)* ) $($rest:tt)* }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $(:: $path)* ! ( $($args)* ) }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ $($path:ident)::+ ! [ $($args:tt)* ] $($rest:tt)* }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($path)::* ! [ $($args)* ] }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ $(:: $path:ident)+ ! [ $($args:tt)* ] $($rest:tt)* }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $(:: $path)* ! [ $($args)* ] }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ $($path:ident)+ ! { $($args:tt)* } $($rest:tt)* }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($path)::* ! { $($args)* } }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ $(:: $path:ident)+ ! { $($args:tt)* } $($rest:tt)* }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $(:: $path)* ! { $($args)* } }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ < $($rest:tt)+ }]
_tokens = [{ $lt:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_parse_type! {
$caller
type_prefix = [{ $lt }]
}
}
};
{
$caller:tt
type_prefix = [{ < }]
type = [{ $($ty:tt)+ }]
rest = [{ }]
} => {
$crate::error_unexpected_last! {
$($ty)*
}
};
{
$caller:tt
type_prefix = [{ $($prefix:tt)* }]
type = [{ $($ty:tt)* }]
rest = [{ $($rest:tt)+ }]
} => {
$crate::private_parse_type! {
$caller
type_prefix = [{ $($prefix)* }]
type = [{ $($ty)* }]
rest = [{ $($rest)* }]
_rest = [{ $($rest)* }]
}
};
{
$caller:tt
type_prefix = [{ $lt:tt }]
type = [{ $($qself:tt)* }]
rest = [{ as :: $_segment:ident $($rest:tt)* }]
_rest = [{ $as:tt $colons:tt $segment:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_possibly_empty_path_after_ident }]
input = [{ $($rest)* }]
~~> $crate::private_parse_type! {
$caller
qpath = [{ $lt $($qself)* $as $colons $segment }]
}
}
};
{
$caller:tt
type_prefix = [{ $lt:tt }]
type = [{ $($qself:tt)* }]
rest = [{ as :: $($unexpected:tt)+ }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
type_prefix = [{ $lt:tt }]
type = [{ $($qself:tt)* }]
rest = [{ as $_segment:ident $($rest:tt)* }]
_rest = [{ $as:tt $segment:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_possibly_empty_path_after_ident }]
input = [{ $($rest)* }]
~~> $crate::private_parse_type! {
$caller
qpath = [{ $lt $($qself)* $as $segment }]
}
}
};
{
$caller:tt
type_prefix = [{ < }]
type = [{ $($qself:tt)* }]
rest = [{ as $($unexpected:tt)+ }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
qpath = [{ $($qpath:tt)* }]
path = [{ $($path:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::private_parse_type! {
$caller
qpath = [{ $($qpath)* }]
path = [{ $($path)* }]
rest = [{ $($rest)* }]
_rest = [{ $($rest)* }]
}
};
{
$caller:tt
qpath = [{ $($qpath:tt)* }]
path = [{ $($path:tt)* }]
rest = [{ > :: $_segment:ident $($rest:tt)* }]
_rest = [{ $gt:tt $colons:tt $segment:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_possibly_empty_path_after_ident }]
input = [{ $($rest)* }]
~~> $crate::private_parse_type! {
$caller
path_prefix = [{ $($qpath)* $($path)* $gt $colons $segment }]
}
}
};
{
$caller:tt
qpath = [{ $($qpath:tt)* }]
path = [{ $($path:tt)* }]
rest = [{ > :: $($unexpected:tt)+ }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
qpath = [{ $($qpath:tt)* }]
path = [{ $($path:tt)* }]
rest = [{ > $($unexpected:tt)+ }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
qpath = [{ $($qpath:tt)* }]
path = [{ $($path:tt)* }]
rest = [{ $($unexpected:tt)+ }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
qpath = [{ $($qpath:tt)* }]
path = [{ $($path:tt)* }]
rest = [{ }]
_rest = [{ }]
} => {
$crate::error_unexpected_last! {
$($qpath)* $($path)*
}
};
{
$caller:tt
type_prefix = [{ $lt:tt }]
type = [{ $($qself:tt)* }]
rest = [{ > :: $_segment:ident $($rest:tt)* }]
_rest = [{ $gt:tt $colons:tt $segment:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_possibly_empty_path_after_ident }]
input = [{ $($rest)* }]
~~> $crate::private_parse_type! {
$caller
path_prefix = [{ $lt $($qself)* $gt $colons $segment }]
}
}
};
{
$caller:tt
type_prefix = [{ < }]
type = [{ $($qself:tt)* }]
rest = [{ $($unexpected:tt)+ }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
tokens = [{ :: $_segment:ident $($rest:tt)* }]
_tokens = [{ $colons:tt $segment:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_path }]
input = [{ $colons $segment $($rest)* }]
~~> $crate::private_parse_type! {
$caller
path_prefix = [{ }]
}
}
};
{
$caller:tt
tokens = [{ :: $($unexpected:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
tokens = [{ $_segment:ident $($rest:tt)* }]
_tokens = [{ $segment:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_path }]
input = [{ $segment $($rest)* }]
~~> $crate::private_parse_type! {
$caller
path_prefix = [{ }]
}
}
};
{
$caller:tt
tokens = [{ ? $($tokens:tt)* }]
_tokens = [{ $question:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_path }]
input = [{ $($tokens)* }]
~~> $crate::private_parse_type! {
$caller
path_prefix = [{ $question }]
}
}
};
{
$caller:tt
path_prefix = [{ $($prefix:tt)* }]
path = [{ $($path:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($prefix)* $($path)* }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
tokens = [{ $($unexpected:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
tokens = [{ }]
_tokens = [{ }]
} => {
$crate::error_eof! {}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_parse_pointer {
{
$caller:tt
pointer = [{ $($pointer:tt)* }]
tokens = [{ $($tokens:tt)* }]
} => {
$crate::private_parse_pointer! {
$caller
pointer = [{ $($pointer)* }]
tokens = [{ $($tokens)* }]
_tokens = [{ $($tokens)* }]
}
};
{
$caller:tt
pointer = [{ $asterisk:tt }]
tokens = [{ const $($rest:tt)+ }]
_tokens = [{ $const:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_parse_pointer! {
$caller
pointer = [{ $asterisk $const }]
}
}
};
{
$caller:tt
pointer = [{ $asterisk:tt }]
tokens = [{ mut $($rest:tt)+ }]
_tokens = [{ $mut:tt $($dup:tt)+ }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_parse_pointer! {
$caller
pointer = [{ $asterisk $mut }]
}
}
};
{
$caller:tt
pointer = [{ * }]
tokens = [{ $($unexpected:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
pointer = [{ $($pointer:tt)* }]
type = [{ $($element:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($pointer)* $($element)* }]
rest = [{ $($rest)* }]
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_parse_reference {
{
$caller:tt
reference = [{ $($reference:tt)* }]
tokens = [{ $($tokens:tt)* }]
} => {
$crate::private_parse_reference! {
$caller
reference = [{ $($reference)* }]
tokens = [{ $($tokens)* }]
_tokens = [{ $($tokens)* }]
}
};
{
$caller:tt
reference = [{ $ampersand:tt }]
tokens = [{ $lifetime:lifetime $($rest:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::private_parse_reference! {
$caller
reference = [{ $ampersand $lifetime }]
tokens = [{ $($rest)* }]
_tokens = [{ $($rest)* }]
}
};
{
$caller:tt
reference = [{ $ampersand:tt $($lifetime:lifetime)* }]
tokens = [{ mut $($rest:tt)+ }]
_tokens = [{ $mut:tt $($dup:tt)* }]
} => {
$crate::private_parse_reference! {
$caller
reference = [{ $ampersand $($lifetime)* $mut }]
tokens = [{ $($rest)* }]
_tokens = [{ $($rest)* }]
}
};
{
$caller:tt
reference = [{ & $($lifetime:lifetime)* }]
tokens = [{ mut }]
_tokens = [{ $unexpected:tt }]
} => {
$crate::error_unexpected! {
$unexpected
}
};
{
$caller:tt
reference = [{ $ampersand:tt $($lifetime:lifetime)* $($mut:ident)* }]
tokens = [{ $($rest:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_parse_reference! {
$caller
reference = [{ $ampersand $($lifetime)* $($mut)* }]
}
}
};
{
$caller:tt
reference = [{ $($reference:tt)* }]
type = [{ $($element:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($reference)* $($element)* }]
rest = [{ $($rest)* }]
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_parse_function {
{
$caller:tt
function = [{ $($function:tt)* }]
tokens = [{ $($tokens:tt)* }]
} => {
$crate::private_parse_function! {
$caller
function = [{ $($function)* }]
tokens = [{ $($tokens)* }]
_tokens = [{ $($tokens)* }]
}
};
{
$caller:tt
function = [{ $fn:tt }]
tokens = [{ ($($args:tt)*) $($rest:tt)* }]
_tokens = [{ $paren:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_validate_fn_args }]
input = [{ $($args)* }]
~~> $crate::private_parse_function! {
$caller
function = [{ $fn $paren }]
rest = [{ $($rest)* }]
_rest = [{ $($rest)* }]
}
}
};
{
$caller:tt
function = [{ $fn:tt }]
tokens = [{ $($unexpected:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
function = [{ $fn:tt $args:tt }]
rest = [{ -> }]
_rest = [{ $arrow:tt }]
} => {
$crate::error_unexpected! {
$arrow
}
};
{
$caller:tt
function = [{ $fn:tt $args:tt }]
rest = [{ -> $($rest:tt)+ }]
_rest = [{ $arrow:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_parse_function! {
$caller
function = [{ $fn $args $arrow }]
}
}
};
{
$caller:tt
function = [{ $fn:tt $args:tt }]
rest = [{ $($rest:tt)* }]
_rest = [{ $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $fn $args }]
rest = [{ $($rest)* }]
}
};
{
$caller:tt
function = [{ $fn:tt $args:tt $arrow:tt }]
type = [{ $($ret:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $fn $args $arrow $($ret)* }]
rest = [{ $($rest)* }]
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_parse_poly_trait {
{
$caller:tt
poly_trait = [{ $($poly_trait:tt)* }]
tokens = [{ $($tokens:tt)+ }]
} => {
$crate::private_parse_poly_trait! {
$caller
poly_trait = [{ $($poly_trait)* }]
tokens = [{ $($tokens)* }]
_tokens = [{ $($tokens)* }]
}
};
{
$caller:tt
poly_trait = [{ $for:tt }]
tokens = [{ < $($rest:tt)+ }]
_tokens = [{ $lt:tt $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_lifetime_params }]
input = [{ $($rest)* }]
~~> $crate::private_parse_poly_trait! {
$caller
poly_trait = [{ $for $lt }]
}
}
};
{
$caller:tt
poly_trait = [{ $for:tt }]
tokens = [{ $($unexpected:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
poly_trait = [{ $for:tt $lt:tt }]
lifetime_params = [{ $($params:tt)* }]
rest = [{ $gt:tt $($rest:tt)+ }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_parse_poly_trait! {
$caller
poly_trait = [{ $for $lt $($params)* $gt }]
}
}
};
{
$caller:tt
poly_trait = [{ $for:tt $lt:tt }]
lifetime_params = [{ $($params:tt)* }]
rest = [{ $gt:tt }]
} => {
$crate::error_unexpected! {
$gt
}
};
{
$caller:tt
poly_trait = [{ $($params:tt)* }]
type = [{ $($ty:tt)* }]
rest = [{ $($rest:tt)* }]
} => {
$crate::tt_return! {
$caller
type = [{ $($params)* $($ty)* }]
rest = [{ $($rest)* }]
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_parse_lifetime_params {
{
$caller:tt
input = [{ $($input:tt)* }]
} => {
$crate::private_parse_lifetime_params! {
$caller
lifetime_params = [{ }]
mode = [{ < }]
tokens = [{ $($input)* }]
_tokens = [{ $($input)* }]
}
};
{
$caller:tt
lifetime_params = [{ $($params:tt)* }]
mode = [{ $any:tt }]
tokens = [{ > $($rest:tt)* }]
_tokens = [{ $gt:tt $($dup:tt)* }]
} => {
$crate::tt_return! {
$caller
lifetime_params = [{ $($params)* }]
rest = [{ $gt $($rest)* }]
}
};
{
$caller:tt
lifetime_params = [{ $($params:tt)* }]
mode = [{ < }]
tokens = [{ $lifetime:lifetime $($rest:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::private_parse_lifetime_params! {
$caller
lifetime_params = [{ $($params)* $lifetime }]
mode = [{ 'a }]
tokens = [{ $($rest)* }]
_tokens = [{ $($rest)* }]
}
};
{
$caller:tt
lifetime_params = [{ $($params:tt)* }]
mode = [{ 'a }]
tokens = [{ : $($rest:tt)+ }]
_tokens = [{ $colon:tt $($dup:tt)* }]
} => {
$crate::private_parse_lifetime_params! {
$caller
lifetime_params = [{ $($params)* $colon }]
mode = [{ : }]
tokens = [{ $($rest)* }]
_tokens = [{ $($rest)* }]
}
};
{
$caller:tt
lifetime_params = [{ $($params:tt)* }]
mode = [{ 'a }]
tokens = [{ , $($rest:tt)+ }]
_tokens = [{ $comma:tt $($dup:tt)* }]
} => {
$crate::private_parse_lifetime_params! {
$caller
lifetime_params = [{ $($params)* $comma }]
mode = [{ < }]
tokens = [{ $($rest)* }]
_tokens = [{ $($rest)* }]
}
};
{
$caller:tt
lifetime_params = [{ $($params:tt)* }]
mode = [{ : }]
tokens = [{ , $($rest:tt)+ }]
_tokens = [{ $comma:tt $($dup:tt)* }]
} => {
$crate::private_parse_lifetime_params! {
$caller
lifetime_params = [{ $($params)* $comma }]
mode = [{ < }]
tokens = [{ $($rest)* }]
_tokens = [{ $($rest)* }]
}
};
{
$caller:tt
lifetime_params = [{ $($params:tt)* }]
mode = [{ $any:tt }]
tokens = [{ $($unexpected:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_validate_inside_brackets {
{
$caller:tt
original = [{ $original:tt }]
input = [{ $($input:tt)+ }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($input)* }]
~~> $crate::private_validate_inside_brackets! {
$caller
original = [{ $original }]
}
}
};
{
$caller:tt
original = [{ $original:tt }]
type = [{ $($bracketed:tt)* }]
rest = [{ }]
} => {
$crate::tt_return! {
$caller
}
};
{
$caller:tt
original = [{ $original:tt }]
type = [{ $($element:tt)* }]
rest = [{ ; $($len:tt)+ }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_expr }]
input = [{ $($len)* }]
~~> $crate::private_validate_inside_brackets! {
$caller
}
}
};
{
$caller:tt
original = [{ $original:tt }]
type = [{ $($element:tt)* }]
rest = [{ ; }]
} => {
$crate::private_unexpected_close_square_bracket_after_ty_semicolon! {
$original
}
};
{
$caller:tt
original = [{ $original:tt }]
type = [{ $($element:tt)* }]
rest = [{ $($unexpected:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
{
$caller:tt
expr = [{ $($len:tt)* }]
rest = [{ }]
} => {
$crate::tt_return! {
$caller
}
};
{
$caller:tt
expr = [{ $($len:tt)* }]
rest = [{ $($unexpected:tt)+ }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_validate_inside_parens {
{
$caller:tt
input = [{ }]
} => {
$crate::tt_return! {
$caller
}
};
{
$caller:tt
input = [{ $($tokens:tt)+ }]
} => {
$crate::tt_call! {
macro = [{ $crate::private_parse_type_with_plus }]
input = [{ $($tokens)* }]
~~> $crate::private_validate_inside_parens! {
$caller
}
}
};
{
$caller:tt
type = [{ $($element:tt)* }]
rest = [{ }]
} => {
$crate::tt_return! {
$caller
}
};
{
$caller:tt
type = [{ $($element:tt)* }]
rest = [{ , }]
} => {
$crate::tt_return! {
$caller
}
};
{
$caller:tt
type = [{ $($element:tt)* }]
rest = [{ , $($rest:tt)+ }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_validate_inside_parens! {
$caller
}
}
};
{
$caller:tt
type = [{ $($element:tt)* }]
rest = [{ $($unexpected:tt)* }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! private_validate_fn_args {
{
$caller:tt
input = [{ $($input:tt)* }]
} => {
$crate::private_validate_fn_args! {
$caller
tokens = [{ $($input)* }]
_tokens = [{ $($input)* }]
}
};
{
$caller:tt
tokens = [{ }]
_tokens = [{ }]
} => {
$crate::tt_return! {
$caller
}
};
{
$caller:tt
tokens = [{ _ : $($rest:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_validate_fn_args! {
$caller
}
}
};
{
$caller:tt
tokens = [{ _ : }]
_tokens = [{ $skip:tt $colon:tt }]
} => {
$crate::error_unexpected! {
$colon
}
};
{
$caller:tt
tokens = [{ $name:ident : $($rest:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_validate_fn_args! {
$caller
}
}
};
{
$caller:tt
tokens = [{ $name:ident : }]
_tokens = [{ $skip:tt $colon:tt }]
} => {
$crate::error_unexpected! {
$colon
}
};
{
$caller:tt
tokens = [{ $($rest:tt)+ }]
_tokens = [{ $($dup:tt)* }]
} => {
$crate::tt_call! {
macro = [{ $crate::parse_type }]
input = [{ $($rest)* }]
~~> $crate::private_validate_fn_args! {
$caller
}
}
};
{
$caller:tt
type = [{ $($ty:tt)* }]
rest = [{ }]
} => {
$crate::tt_return! {
$caller
}
};
{
$caller:tt
type = [{ $($ty:tt)* }]
rest = [{ , $($rest:tt)* }]
} => {
$crate::private_validate_fn_args! {
$caller
input = [{ $($rest)* }]
}
};
{
$caller:tt
type = [{ $($ty:tt)* }]
rest = [{ $($unexpected:tt)+ }]
} => {
$crate::error_unexpected! {
$($unexpected)*
}
};
}