#[cfg(feature = "parsing")]
#[cfg_attr(feature = "docsrs", doc(cfg(feature = "parsing")))]
#[macro_export]
macro_rules! parse_any {
($place:expr, find_skip; $($branches:tt)* ) => {
$crate::__priv_pa_normalize_branches!{
($place, FromStart, __priv_pa_find_skip, outside_konst)
()
$($branches)*
}
};
($place:expr, rfind_skip; $($branches:tt)* ) => {
$crate::__priv_pa_normalize_branches!{
($place, FromEnd, __priv_pa_rfind_skip, outside_konst)
()
$($branches)*
}
};
($place:expr, strip_prefix; $($branches:tt)* ) => {
$crate::__priv_pa_normalize_branches!{
($place, FromStart, __priv_pa_strip_prefix, outside_konst)
()
$($branches)*
}
};
($place:expr, strip_suffix; $($branches:tt)* ) => {
$crate::__priv_pa_normalize_branches!{
($place, FromEnd, __priv_pa_strip_suffix, outside_konst)
()
$($branches)*
}
};
($place:expr, trim_start_matches; $($branches:tt)* ) => {
$crate::__priv_pa_normalize_branches!{
($place, FromStart, __priv_pa_trim_start_matches, outside_konst)
()
$($branches)*
}
};
($place:expr, trim_end_matches; $($branches:tt)* ) => {
$crate::__priv_pa_normalize_branches!{
($place, FromEnd, __priv_pa_trim_end_matches, outside_konst)
()
$($branches)*
}
};
($place:expr, $unknown_method:ident; $($branches:tt)* ) => {
$crate::__::compile_error!{"\
Expected the second argument (the name of the Parser method) to be one of: \n\
- find_skip \n\
- rfind_skip \n\
- strip_prefix \n\
- strip_suffix \n\
- trim_start_matches \n\
- trim_end_matches \n\
"}
};
}
#[allow(unused_macros)]
macro_rules! parse_any_priv {
($place:expr, $parse_direction:ident,$method_macro:ident; $($branches:tt)* ) => {
$crate::__priv_pa_normalize_branches!{
($place, $parse_direction, $method_macro, inside_konst)
()
$($branches)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_normalize_branches {
(
($place:expr, $parse_direction:ident, $method_macro:ident, $call_place:tt)
()
$($pattern:pat)|*
) => {
$crate::$method_macro!{
($place, $parse_direction, $call_place)
$($pattern)|*
}
};
(
($place:expr, $parse_direction:ident, $method_macro:ident, $call_place:tt)
( $($branches:tt)* )
_ => $expr:expr
$(, $($rem:tt)*)?
) => {{
$crate::__priv_no_tokens_after_last_branch!{$($($rem)*)?}
$crate::$method_macro!{
($place, $parse_direction, $call_place)
$($branches)*
default => ($expr)
}
}};
(
$fixed_params:tt
( $($prev_branch:tt)* )
$($pattern:pat)|* => $expr:expr,
$($rem:tt)*
) => {{
$crate::__priv_tokens_after_middle_branch!{$($rem)*}
$crate::__priv_pa_normalize_branches!{
$fixed_params
(
$($prev_branch)*
($($pattern)|*) => ($expr)
)
$($rem)*
}
}};
(
$fixed_params:tt
( $($prev_branch:tt)* )
$($pattern:pat)|* => $expr:block
$($rem:tt)*
) => {{
$crate::__priv_tokens_after_middle_branch!{$($rem)*}
$crate::__priv_pa_normalize_branches!{
$fixed_params
(
$($prev_branch)*
($($pattern)|*) => ($expr)
)
$($rem)*
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_find_skip {
( $($args:tt)* ) => {{
$crate::__priv_pa_find_skip_either!{
brem, [_, brem @ ..], __priv_bstr_start,
$($args)*
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_rfind_skip {
( $($args:tt)* ) => {{
$crate::__priv_pa_find_skip_either!{
brem, [brem @ .., _], __priv_bstr_end,
$($args)*
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_find_skip_either {
(
$brem:ident,
$split_first_pat:pat,
$pat_proc_macro:ident,
$accessor_args:tt
$(
($($pattern:pat)|*)=>($e:expr)
)*
default => ($default:expr)
) => {{
let mut bytes = $crate::__priv_pa_bytes_accessor!(get, $accessor_args);
loop {
match bytes {
$(
$( $crate::$pat_proc_macro!(rem, $pattern))|* => {
$crate::__priv_pa_bytes_accessor!(set, $accessor_args, rem);
break $e
}
)*
_ => {
if let $split_first_pat = bytes {
bytes = $brem;
} else {
break $default;
}
}
}
}
}}
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_strip_prefix {
(
$accessor_args:tt
$(
($($pattern:pat)|*)=>($e:expr)
)*
default => $default:expr
) => {
match $crate::__priv_pa_bytes_accessor!(get, $accessor_args) {
$(
$( $crate::__priv_bstr_start!(rem, $pattern))|* => {
$crate::__priv_pa_bytes_accessor!(set, $accessor_args, rem);
$e
}
)*
_ => $default,
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_strip_suffix {
(
$accessor_args:tt
$(
($($pattern:pat)|*)=>($e:expr)
)*
default => ($default:expr)
) => {
match $crate::__priv_pa_bytes_accessor!(get, $accessor_args) {
$(
$( $crate::__priv_bstr_end!(rem, $pattern))|* => {
$crate::__priv_pa_bytes_accessor!(set, $accessor_args, rem);
$e
}
)*
_ => $default,
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_trim_start_matches {
( $($args:tt)* ) => {
$crate::__priv_pa_trim_matches_inner!{__priv_bstr_start $($args)*}
}
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_trim_end_matches {
( $($args:tt)* ) => {
$crate::__priv_pa_trim_matches_inner!{__priv_bstr_end $($args)*}
}
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_trim_matches_inner{
(
$pat_proc_macro:ident
$accessor_args:tt
$($pattern:pat)|*
) => {{
let mut bytes = $crate::__priv_pa_bytes_accessor!(get, $accessor_args);
while let $( $crate::$pat_proc_macro!(rem, $pattern) )|* = bytes {
if rem.len() == bytes.len() {
break
} else {
bytes = rem;
}
}
$crate::__priv_pa_bytes_accessor!(set, $accessor_args, bytes);
}}
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_pa_bytes_accessor {
(get, ($place:expr, $parse_direction:ident, inside_konst)) => {{
$place.parse_direction = $crate::parsing::ParseDirection::$parse_direction;
$place.bytes
}};
(get, ($place:expr, $parse_direction:ident, outside_konst)) => {
$place.bytes()
};
(set, ($place:expr, FromStart, inside_konst), $rem:expr) => {
#[allow(unused_assignments)]
{
let before = $place.bytes.len();
$place.bytes = $rem;
$place.start_offset += (before - $place.bytes.len()) as u32;
}
};
(set, ($place:expr, FromEnd, inside_konst), $rem:expr) => {
#[allow(unused_assignments)]
{
$place.bytes = $rem;
}
};
(set, ($place:expr, FromStart, outside_konst), $rem:expr) => {
#[allow(unused_assignments)]
{
$place = $place.advance_to_remainder_from_start($rem);
}
};
(set, ($place:expr, FromEnd, outside_konst), $rem:expr) => {
#[allow(unused_assignments)]
{
$place = $place.advance_to_remainder_from_end($rem);
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_no_tokens_after_last_branch {
() => {};
($($tokens:tt)+) => {
compile_error! {"expected no branches after the first `_ => <expression>` branch"}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __priv_tokens_after_middle_branch {
() => {
compile_error! {"expected more branches, ending with a `_ => <expression>` branch"}
};
($($tokens:tt)+) => {};
}