1#![allow(non_snake_case)]
2
3use proc_macro2::{Literal, Span, TokenStream};
4use quote::{format_ident, quote};
5use syn::Ident;
6
7use crate::codegen::Group;
8
9pub(crate) fn impl_captures(
10 regex_name: &Ident,
11 groups: Vec<Group>,
12) -> (Ident, Literal, TokenStream) {
13 let Capture = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Capture");
_s
}quote!(::ct_regex::internal::expr::Capture);
14 let FromRanges = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromRanges");
_s
}quote!(::ct_regex::internal::expr::FromRanges);
15 let HaystackSlice = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "haystack");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "HaystackSlice");
_s
}quote!(::ct_regex::internal::haystack::HaystackSlice);
16 let Range = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ops");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Range");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "usize");
::quote::__private::push_gt(&mut _s);
_s
}quote!(::std::ops::Range<usize>);
17 let Option = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
_s
}quote!(::std::option::Option);
18 let PhantomData = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "marker");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "PhantomData");
_s
}quote!(::std::marker::PhantomData);
19
20 let len_usize = groups.len();
21
22 let name = match ::quote::__private::IdentFragmentAdapter(®ex_name) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}Capture", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("{}Capture", regex_name);
23 let len = Literal::usize_unsuffixed(len_usize);
24
25 let doc = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("A macro-generated type that holds {0} captures for the associated regex, [`{1}`]. If present, named groups can be retrieved through their associated method.\n\nCapture types include methods to retrieve individual captures as a slice of the original haystack, or as the underlying [`Range<usize>`](::std::range::Range), which can be used to manually slice the haystack (without risk of panicking in the case of `&str`).\n\nAs is common with regular expressions, group `0` refers to the whole match (and is therefore aliased as [`{2}::whole_match`]).",
len_usize, regex_name, name))
})format!(
26 "A macro-generated type that holds {len_usize} captures for the associated regex, \
27 [`{regex_name}`]. If present, named groups can be retrieved through their associated \
28 method.\n\n\
29 Capture types include methods to retrieve individual captures as a slice of the original \
30 haystack, or as the underlying [`Range<usize>`](::std::range::Range), which can be used \
31 to manually slice the haystack (without risk of panicking in the case of `&str`).\n\n\
32 As is common with regular expressions, group `0` refers to the whole match (and is \
33 therefore aliased as [`{name}::whole_match`])."
34 );
35
36 if !!groups.is_empty() {
::core::panicking::panic("assertion failed: !groups.is_empty()")
};assert!(!groups.is_empty());
37
38 let inner = groups.iter().map(|cap| {
39 if cap.required {
40 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&Range, &mut _s);
_s
}quote!(#Range)
41 } else {
42 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&Option, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&Range, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(#Option<#Range>)
43 }
44 });
45
46 let numbered_groups = groups.iter()
47 .enumerate()
48 .map(|(index, cap)| impl_capture_getters(index, cap, match ::quote::__private::IdentFragmentAdapter(&index) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("cap_{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("cap_{}", index)));
49
50 let named_groups = groups.iter().enumerate().filter_map(|(index, cap)| {
51 cap.name.as_ref().map(|cap_name| {
52 impl_capture_getters(index, cap, Ident::new(cap_name, Span::call_site()))
53 })
54 });
55
56 let capture_destructure = (0..groups.len()).map(|i| match ::quote::__private::IdentFragmentAdapter(&i) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("c{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("c{}", i));
57
58 let capture_constructor = groups.iter().enumerate().map(|(index, cap)| {
59 let ident = match ::quote::__private::IdentFragmentAdapter(&index) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("c{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("c{}", index);
60 if cap.required {
61 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::__private::push_question(&mut _s);
_s
}quote!(#ident?)
62 } else {
63 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ident, &mut _s);
_s
}quote!(#ident)
64 }
65 });
66
67 let captures_impl = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&doc, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "derive");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Debug");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Clone");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "struct");
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&HaystackSlice, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut inner, i) = inner.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let inner =
match inner.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&inner, &mut _s);
}
}
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&PhantomData, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&HaystackSlice, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_shr(&mut _s);
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut numbered_groups, i) =
numbered_groups.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let numbered_groups =
match numbered_groups.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&numbered_groups, &mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut named_groups, i) = named_groups.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let named_groups =
match named_groups.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&named_groups, &mut _s);
}
}
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&HaystackSlice, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_shr(&mut _s);
::quote::ToTokens::to_tokens(&Capture, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "whole_match_range");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::ToTokens::to_tokens(&Range, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::parse(&mut _s, "1");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "clone");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "whole_match");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::parse(&mut _s, "0");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "slice_with");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"whole_match_range");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&HaystackSlice, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_shr(&mut _s);
::quote::ToTokens::to_tokens(&FromRanges, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&len, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'a");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "from_ranges");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "ranges");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&Option, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&Range, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&len, &mut _s);
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "hay");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::ToTokens::to_tokens(&Option, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut capture_destructure, i) =
capture_destructure.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let capture_destructure =
match capture_destructure.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&capture_destructure, &mut _s);
}
}
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "ranges");
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&Option, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "hay");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut capture_constructor, i) =
capture_constructor.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let capture_constructor =
match capture_constructor.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&capture_constructor, &mut _s);
}
}
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&PhantomData, &mut _s);
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
_s
});
_s
}quote! {
70 #[doc = #doc]
71 #[derive(Debug, Clone)]
72 pub struct #name<'a, S: #HaystackSlice<'a>>(
73 S,
74 #(#inner),*,
75 #PhantomData<&'a ()>,
76 );
77
78 impl<'a, S: #HaystackSlice<'a>> #name<'a, S> {
79 #(#numbered_groups)*
80
81 #(#named_groups)*
82 }
83
84 impl<'a, S: #HaystackSlice<'a>> #Capture<'a, S> for #name<'a, S> {
85 fn whole_match_range(&self) -> #Range {
86 self.1.clone()
87 }
88
89 fn whole_match(&self) -> S {
90 self.0.slice_with(self.whole_match_range())
91 }
92 }
93
94 impl<'a, S: #HaystackSlice<'a>> #FromRanges<'a, S, #len> for #name<'a, S> {
95 fn from_ranges(
96 ranges: [#Option<#Range>; #len],
97 hay: S,
98 ) -> #Option<Self> {
99 let [#(#capture_destructure),*] = ranges;
100 #Option::Some(Self(
101 hay,
102 #(#capture_constructor),*,
103 #PhantomData,
104 ))
105 }
106 }
107 };
108
109 (name, len, captures_impl)
110}
111
112pub(crate) fn impl_capture_getters(index: usize, cap: &Group, cap_name: Ident) -> TokenStream {
113 let Range = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ops");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Range");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "usize");
::quote::__private::push_gt(&mut _s);
_s
}quote!(::std::ops::Range<usize>);
114 let Option = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
_s
}quote!(::std::option::Option);
115
116 let index = index + 1;
117 let cap_name_full = match ::quote::__private::IdentFragmentAdapter(&cap_name) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}_range", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("{}_range", cap_name);
118 let index_name = Literal::usize_unsuffixed(index);
119
120 if cap.required {
121 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::ToTokens::to_tokens(&cap_name, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::parse(&mut _s, "0");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "slice_with");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&cap_name_full, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::ToTokens::to_tokens(&cap_name_full, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::ToTokens::to_tokens(&Range, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&index_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "clone");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
}quote! {
122 pub fn #cap_name(&self) -> S {
123 self.0.slice_with(self.#cap_name_full())
124 }
125
126 pub fn #cap_name_full(&self) -> #Range {
127 self.#index_name.clone()
128 }
129 }
130 } else {
131 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::ToTokens::to_tokens(&cap_name, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::ToTokens::to_tokens(&Option, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "S");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&cap_name_full, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "r");
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::parse(&mut _s, "0");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "slice_with");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "r");
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::ToTokens::to_tokens(&cap_name_full, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::ToTokens::to_tokens(&Option, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&Range, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&index_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "clone");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
}quote! {
132 pub fn #cap_name(&self) -> #Option<S> {
133 self.#cap_name_full().map(|r| self.0.slice_with(r))
134 }
135
136 pub fn #cap_name_full(&self) -> #Option<#Range> {
137 self.#index_name.clone()
138 }
139 }
140 }
141}