macro_rules! state_body {
( | [ $self:tt, $ctx:tt, $input:ident] |> [ memchr($memchr:literal) => $($arms:tt)+]) => {
let ch = if $self.consume_until($memchr, $input) { Some(()) } else { None };
state_body!(@map_arms | [$self, $ctx, $input, ch] |> [ _ => $($arms)+], []);
};
( | [ $self:tt, $ctx:tt, $input:ident] |> [$($arms:tt)+]) => {
#[allow(clippy::never_loop)]
loop {
let ch = $self.consume_ch($input);
state_body!(@map_arms | [$self, $ctx, $input, ch] |> [$($arms)+], []);
}
};
( @map_arms
| $scope_vars:tt |>
[ $pat:tt => ( $($actions:tt)* ) $($rest:tt)* ], [ $($expanded:tt)* ]
) => {
arm_pattern!(|[ $scope_vars, [$($rest)*], [$($expanded)*] ]|> $pat => ( $($actions)* ))
};
( @map_arms
| $scope_vars:tt |>
[], [$($expanded:tt)*]
) => {
state_body!(@match_block |$scope_vars|> $($expanded)*);
};
( @callback
| [ $scope_vars:tt, [$($pending:tt)*], [$($expanded:tt)*] ] |>
$($expanded_arm:tt)*
) => {
state_body!(@map_arms | $scope_vars |> [$($pending)*], [$($expanded)* $($expanded_arm)*])
};
( @match_block
| [ $self:tt, $ctx:tt, $input:ident, $ch:ident ] |>
$( $pat:pat_param $(|$pat_cont:pat)* $(if $pat_expr:expr)* => ( $($actions:tt)* ) )*
) => {
#[deny(unreachable_patterns)]
match $ch {
$(
$pat $(| $pat_cont)* $(if $pat_expr)* => {
action_list!(|$self, $ctx, $input|> $($actions)*);
}
)*
}
};
}