/// Extracts typed literal values from a `TokenStream` with concise syntax.
///
/// This is the primary entry point for most proc-macro use. It wraps [`extract`]
/// for single-value extraction and uses an iterator-based approach for
/// multi-value (variadic) extraction.
///
/// # Syntax
///
/// ```ignore
/// litext!(input) // Extract as String, return early on error
/// litext!(input as String) // Same, explicit type
/// litext!(input as T) // Extract as type T, return early on error
/// litext!(try input) // Extract as String, return Result
/// litext!(try input as T) // Extract as T, return Result
///
/// // Multi-extraction: types separated by a punctuation separator
/// litext!(input as (T1 sep T2)) // Extract two values, return early on error
/// litext!(try input as (T1 sep T2)) // Same, return Result<(T1, T2), _>
/// ```
///
/// Up to 12 values can be extracted per call.
///
/// # Arguments
///
/// - `input`: a bare variable name (ident) holding the `TokenStream`
/// - `as T`: the target type; defaults to `String`
/// - `try`: when present, returns `Result<T, TokenStream>` instead of returning early
/// - `as (T1 sep T2 ...)`: extracts multiple values separated by `sep` in the token stream
///
/// # Multi-Extraction Notes
///
/// Type arguments in tuple position must be single-token identifiers.
/// `LitInt<u8>` spans multiple tokens and cannot be used directly.
/// Use `LitInt` (defaults to `i32`) or a plain integer type like `i32` instead.
///
/// The separator `sep` is any single punctuation token (`,`, `;`, `|`, etc.)
/// and must match the actual separator in the input `TokenStream`.
///
/// # Examples
///
/// ```ignore
/// use litext::{litext, LitStr, TokenStream};
///
/// fn my_string_macro(input: TokenStream) -> TokenStream {
/// let text: String = litext!(input);
/// // or: let text: String = litext!(input as String);
/// quote::quote! { #text }
/// }
///
/// fn my_int_macro(input: TokenStream) -> TokenStream {
/// let num: i32 = litext!(input as i32);
/// quote::quote! { #num }
/// }
///
/// fn my_try_macro(input: TokenStream) -> TokenStream {
/// let result: Result<String, _> = litext!(try input);
/// match result {
/// Ok(text) => quote::quote! { #text },
/// Err(e) => e,
/// }
/// }
///
/// fn my_multi_macro(input: TokenStream) -> TokenStream {
/// // input must be: "name" , 42
/// let (name, count): (String, u32) = litext!(input as (String , u32));
/// quote::quote! { /* use name and count */ }
/// }
/// ```
///
/// # See Also
///
/// - [`extract`] for extracting a single value directly without the macro
/// - [`FromLit`] for implementing custom literal types
#[macro_export]
macro_rules! litext {
// -----------------------------------------------------------------------
// Private @inner arms
// Each arm extracts all tokens, accumulates errors via comperr, and
// returns (Option<comperr::Error>, Result<T1>, Result<T2>, ...)
// The public arms then destructure this and decide what to do.
// -----------------------------------------------------------------------
(@inner $iter:expr, $T1:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let _s5 = $crate::consume_sep(&mut $iter, stringify!($s5), proc_macro2::Span::call_site());
let _r6 = $crate::extract_from_iter::<$T6>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned(), _s5.as_ref().err().cloned(), _r6.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5, _r6)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let _s5 = $crate::consume_sep(&mut $iter, stringify!($s5), proc_macro2::Span::call_site());
let _r6 = $crate::extract_from_iter::<$T6>(&mut $iter);
let _s6 = $crate::consume_sep(&mut $iter, stringify!($s6), proc_macro2::Span::call_site());
let _r7 = $crate::extract_from_iter::<$T7>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned(), _s5.as_ref().err().cloned(), _r6.as_ref().err().cloned(), _s6.as_ref().err().cloned(), _r7.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let _s5 = $crate::consume_sep(&mut $iter, stringify!($s5), proc_macro2::Span::call_site());
let _r6 = $crate::extract_from_iter::<$T6>(&mut $iter);
let _s6 = $crate::consume_sep(&mut $iter, stringify!($s6), proc_macro2::Span::call_site());
let _r7 = $crate::extract_from_iter::<$T7>(&mut $iter);
let _s7 = $crate::consume_sep(&mut $iter, stringify!($s7), proc_macro2::Span::call_site());
let _r8 = $crate::extract_from_iter::<$T8>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned(), _s5.as_ref().err().cloned(), _r6.as_ref().err().cloned(), _s6.as_ref().err().cloned(), _r7.as_ref().err().cloned(), _s7.as_ref().err().cloned(), _r8.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let _s5 = $crate::consume_sep(&mut $iter, stringify!($s5), proc_macro2::Span::call_site());
let _r6 = $crate::extract_from_iter::<$T6>(&mut $iter);
let _s6 = $crate::consume_sep(&mut $iter, stringify!($s6), proc_macro2::Span::call_site());
let _r7 = $crate::extract_from_iter::<$T7>(&mut $iter);
let _s7 = $crate::consume_sep(&mut $iter, stringify!($s7), proc_macro2::Span::call_site());
let _r8 = $crate::extract_from_iter::<$T8>(&mut $iter);
let _s8 = $crate::consume_sep(&mut $iter, stringify!($s8), proc_macro2::Span::call_site());
let _r9 = $crate::extract_from_iter::<$T9>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned(), _s5.as_ref().err().cloned(), _r6.as_ref().err().cloned(), _s6.as_ref().err().cloned(), _r7.as_ref().err().cloned(), _s7.as_ref().err().cloned(), _r8.as_ref().err().cloned(), _s8.as_ref().err().cloned(), _r9.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let _s5 = $crate::consume_sep(&mut $iter, stringify!($s5), proc_macro2::Span::call_site());
let _r6 = $crate::extract_from_iter::<$T6>(&mut $iter);
let _s6 = $crate::consume_sep(&mut $iter, stringify!($s6), proc_macro2::Span::call_site());
let _r7 = $crate::extract_from_iter::<$T7>(&mut $iter);
let _s7 = $crate::consume_sep(&mut $iter, stringify!($s7), proc_macro2::Span::call_site());
let _r8 = $crate::extract_from_iter::<$T8>(&mut $iter);
let _s8 = $crate::consume_sep(&mut $iter, stringify!($s8), proc_macro2::Span::call_site());
let _r9 = $crate::extract_from_iter::<$T9>(&mut $iter);
let _s9 = $crate::consume_sep(&mut $iter, stringify!($s9), proc_macro2::Span::call_site());
let _r10 = $crate::extract_from_iter::<$T10>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned(), _s5.as_ref().err().cloned(), _r6.as_ref().err().cloned(), _s6.as_ref().err().cloned(), _r7.as_ref().err().cloned(), _s7.as_ref().err().cloned(), _r8.as_ref().err().cloned(), _s8.as_ref().err().cloned(), _r9.as_ref().err().cloned(), _s9.as_ref().err().cloned(), _r10.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt $s10:tt $T11:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let _s5 = $crate::consume_sep(&mut $iter, stringify!($s5), proc_macro2::Span::call_site());
let _r6 = $crate::extract_from_iter::<$T6>(&mut $iter);
let _s6 = $crate::consume_sep(&mut $iter, stringify!($s6), proc_macro2::Span::call_site());
let _r7 = $crate::extract_from_iter::<$T7>(&mut $iter);
let _s7 = $crate::consume_sep(&mut $iter, stringify!($s7), proc_macro2::Span::call_site());
let _r8 = $crate::extract_from_iter::<$T8>(&mut $iter);
let _s8 = $crate::consume_sep(&mut $iter, stringify!($s8), proc_macro2::Span::call_site());
let _r9 = $crate::extract_from_iter::<$T9>(&mut $iter);
let _s9 = $crate::consume_sep(&mut $iter, stringify!($s9), proc_macro2::Span::call_site());
let _r10 = $crate::extract_from_iter::<$T10>(&mut $iter);
let _s10 = $crate::consume_sep(&mut $iter, stringify!($s10), proc_macro2::Span::call_site());
let _r11 = $crate::extract_from_iter::<$T11>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned(), _s5.as_ref().err().cloned(), _r6.as_ref().err().cloned(), _s6.as_ref().err().cloned(), _r7.as_ref().err().cloned(), _s7.as_ref().err().cloned(), _r8.as_ref().err().cloned(), _s8.as_ref().err().cloned(), _r9.as_ref().err().cloned(), _s9.as_ref().err().cloned(), _r10.as_ref().err().cloned(), _s10.as_ref().err().cloned(), _r11.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11)
}};
(@inner $iter:expr, $T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt $s10:tt $T11:tt $s11:tt $T12:tt) => {{
let _r1 = $crate::extract_from_iter::<$T1>(&mut $iter);
let _s1 = $crate::consume_sep(&mut $iter, stringify!($s1), proc_macro2::Span::call_site());
let _r2 = $crate::extract_from_iter::<$T2>(&mut $iter);
let _s2 = $crate::consume_sep(&mut $iter, stringify!($s2), proc_macro2::Span::call_site());
let _r3 = $crate::extract_from_iter::<$T3>(&mut $iter);
let _s3 = $crate::consume_sep(&mut $iter, stringify!($s3), proc_macro2::Span::call_site());
let _r4 = $crate::extract_from_iter::<$T4>(&mut $iter);
let _s4 = $crate::consume_sep(&mut $iter, stringify!($s4), proc_macro2::Span::call_site());
let _r5 = $crate::extract_from_iter::<$T5>(&mut $iter);
let _s5 = $crate::consume_sep(&mut $iter, stringify!($s5), proc_macro2::Span::call_site());
let _r6 = $crate::extract_from_iter::<$T6>(&mut $iter);
let _s6 = $crate::consume_sep(&mut $iter, stringify!($s6), proc_macro2::Span::call_site());
let _r7 = $crate::extract_from_iter::<$T7>(&mut $iter);
let _s7 = $crate::consume_sep(&mut $iter, stringify!($s7), proc_macro2::Span::call_site());
let _r8 = $crate::extract_from_iter::<$T8>(&mut $iter);
let _s8 = $crate::consume_sep(&mut $iter, stringify!($s8), proc_macro2::Span::call_site());
let _r9 = $crate::extract_from_iter::<$T9>(&mut $iter);
let _s9 = $crate::consume_sep(&mut $iter, stringify!($s9), proc_macro2::Span::call_site());
let _r10 = $crate::extract_from_iter::<$T10>(&mut $iter);
let _s10 = $crate::consume_sep(&mut $iter, stringify!($s10), proc_macro2::Span::call_site());
let _r11 = $crate::extract_from_iter::<$T11>(&mut $iter);
let _s11 = $crate::consume_sep(&mut $iter, stringify!($s11), proc_macro2::Span::call_site());
let _r12 = $crate::extract_from_iter::<$T12>(&mut $iter);
let mut _err: Option<comperr::Error> = None;
for e in [_r1.as_ref().err().cloned(), _s1.as_ref().err().cloned(), _r2.as_ref().err().cloned(), _s2.as_ref().err().cloned(), _r3.as_ref().err().cloned(), _s3.as_ref().err().cloned(), _r4.as_ref().err().cloned(), _s4.as_ref().err().cloned(), _r5.as_ref().err().cloned(), _s5.as_ref().err().cloned(), _r6.as_ref().err().cloned(), _s6.as_ref().err().cloned(), _r7.as_ref().err().cloned(), _s7.as_ref().err().cloned(), _r8.as_ref().err().cloned(), _s8.as_ref().err().cloned(), _r9.as_ref().err().cloned(), _s9.as_ref().err().cloned(), _r10.as_ref().err().cloned(), _s10.as_ref().err().cloned(), _r11.as_ref().err().cloned(), _s11.as_ref().err().cloned(), _r12.as_ref().err().cloned()].into_iter().flatten() {
match _err.as_mut() { Some(acc) => acc.combine(e), None => _err = Some(e) }
}
(_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11, _r12)
}};
// -----------------------------------------------------------------------
// Public variadic arms
// -----------------------------------------------------------------------
($input:ident as ($T1:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1) = litext!(@inner _iter, $T1);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(),)
}};
($input:ident as ($T1:tt $s1:tt $T2:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2) = litext!(@inner _iter, $T1 $s1 $T2);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9 $s9 $T10);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap(), _r10.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt $s10:tt $T11:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9 $s9 $T10 $s10 $T11);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap(), _r10.unwrap(), _r11.unwrap())
}};
($input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt $s10:tt $T11:tt $s11:tt $T12:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11, _r12) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9 $s9 $T10 $s10 $T11 $s11 $T12);
if let Some(e) = _err { return e.to_compile_error(); }
(_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap(), _r10.unwrap(), _r11.unwrap(), _r12.unwrap())
}};
// -----------------------------------------------------------------------
// Public try variadic arms
// -----------------------------------------------------------------------
(try $input:ident as ($T1:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1) = litext!(@inner _iter, $T1);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(),)) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2) = litext!(@inner _iter, $T1 $s1 $T2);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9 $s9 $T10);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap(), _r10.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt $s10:tt $T11:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9 $s9 $T10 $s10 $T11);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap(), _r10.unwrap(), _r11.unwrap())) }
}};
(try $input:ident as ($T1:tt $s1:tt $T2:tt $s2:tt $T3:tt $s3:tt $T4:tt $s4:tt $T5:tt $s5:tt $T6:tt $s6:tt $T7:tt $s7:tt $T8:tt $s8:tt $T9:tt $s9:tt $T10:tt $s10:tt $T11:tt $s11:tt $T12:tt)) => {{
let mut _iter = $input.into_iter();
let (_err, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11, _r12) = litext!(@inner _iter, $T1 $s1 $T2 $s2 $T3 $s3 $T4 $s4 $T5 $s5 $T6 $s6 $T7 $s7 $T8 $s8 $T9 $s9 $T10 $s10 $T11 $s11 $T12);
if let Some(e) = _err { Err(e.to_compile_error()) } else { Ok((_r1.unwrap(), _r2.unwrap(), _r3.unwrap(), _r4.unwrap(), _r5.unwrap(), _r6.unwrap(), _r7.unwrap(), _r8.unwrap(), _r9.unwrap(), _r10.unwrap(), _r11.unwrap(), _r12.unwrap())) }
}};
// -----------------------------------------------------------------------
// Single extraction forms
// -----------------------------------------------------------------------
($input:ident $(as String)?) => {
match $crate::extract::<String>($input.into()) {
Ok(s) => s,
Err(e) => return e,
}
};
(try $input:ident) => {
$crate::extract::<String>($input.into())
};
($input:ident as $T:ty) => {
match $crate::extract::<$T>($input.into()) {
Ok(v) => v,
Err(e) => return e,
}
};
(try $input:ident as $T:ty) => {
$crate::extract::<$T>($input.into())
};
}