1use proc_macro2::Span;
2use proc_macro2::TokenStream;
3use quote::ToTokens;
4use quote::TokenStreamExt;
5use quote::format_ident;
6use quote::quote;
7use std::iter;
8use syn::parse::{Parse, ParseStream, Result};
9use syn::punctuated::Pair;
10use syn::punctuated::Punctuated;
11use syn::spanned::Spanned;
12use syn::{
13 Attribute, GenericArgument, Generics, Ident, ImplGenerics, LitStr, PathArguments, Token, Type,
14 TypeGenerics, parenthesized, parse_quote,
15};
16use syn::{GenericParam, Meta};
17use syn::{LitBool, Path};
18use syn::{LitInt, MetaNameValue};
19
20use crate::attrs::{AttributeSpanWrapper, MySpanned};
21use crate::util::parse_eq;
22
23const VARIADIC_VARIANTS_DEFAULT: usize = 2;
24const VARIADIC_ARG_COUNT_ENV: Option<&str> = ::core::option::Option::None::<&'static str>option_env!("DIESEL_VARIADIC_FUNCTION_ARGS");
25
26pub(crate) fn expand(
27 input: Vec<SqlFunctionDecl>,
28 legacy_helper_type_and_module: bool,
29 generate_return_type_helpers: bool,
30) -> TokenStream {
31 let mut result = TokenStream::new();
32 let mut return_type_helper_module_paths = ::alloc::vec::Vec::new()vec![];
33
34 for decl in input {
35 let expanded = expand_one(
36 decl,
37 legacy_helper_type_and_module,
38 generate_return_type_helpers,
39 );
40 let expanded = match expanded {
41 Err(err) => err.into_compile_error(),
42 Ok(expanded) => {
43 if let Some(return_type_helper_module_path) =
44 expanded.return_type_helper_module_path
45 {
46 return_type_helper_module_paths.push(return_type_helper_module_path);
47 }
48
49 expanded.tokens
50 }
51 };
52
53 result.append_all(expanded);
54 }
55
56 if !generate_return_type_helpers {
57 return result;
58 }
59
60 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result, &mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unused_imports");
_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, "doc");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "hidden");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "mod");
::quote::__private::push_ident(&mut _s, "return_type_helpers");
::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 return_type_helper_module_paths, i) =
return_type_helper_module_paths.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let return_type_helper_module_paths =
match return_type_helper_module_paths.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::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_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "inline");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "super");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&return_type_helper_module_paths,
&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_star(&mut _s);
::quote::__private::push_semi(&mut _s);
}
}
_s
});
_s
}quote! {
61 #result
62
63 #[allow(unused_imports)]
64 #[doc(hidden)]
65 mod return_type_helpers {
66 #(
67 #[doc(inline)]
68 pub use super:: #return_type_helper_module_paths ::*;
69 )*
70 }
71 }
72}
73
74struct ExpandedSqlFunction {
75 tokens: TokenStream,
76 return_type_helper_module_path: Option<Path>,
77}
78
79fn expand_one(
80 mut input: SqlFunctionDecl,
81 legacy_helper_type_and_module: bool,
82 generate_return_type_helpers: bool,
83) -> syn::Result<ExpandedSqlFunction> {
84 let attributes = &mut input.attributes;
85
86 let variadic_argument_count = attributes.iter().find_map(|attr| {
87 if let SqlFunctionAttribute::Variadic {
88 count: number,
89 skip_zero_arg_variant: flag,
90 ..
91 } = &attr.item
92 {
93 Some((number.base10_parse(), number.span(), flag.value))
94 } else {
95 None
96 }
97 });
98
99 let Some((variadic_argument_count, variadic_span, non_zero_variadic)) = variadic_argument_count
100 else {
101 let sql_name = parse_sql_name_attr(&mut input);
102
103 return expand_nonvariadic(
104 input,
105 sql_name,
106 legacy_helper_type_and_module,
107 generate_return_type_helpers,
108 );
109 };
110
111 let variadic_argument_count = variadic_argument_count?;
112 let start_idx = if non_zero_variadic { 1 } else { 0 };
113
114 let variadic_variants = VARIADIC_ARG_COUNT_ENV
115 .and_then(|arg_count| arg_count.parse::<usize>().ok())
116 .unwrap_or(VARIADIC_VARIANTS_DEFAULT);
117
118 let mut result = TokenStream::new();
119 let mut helper_type_modules = ::alloc::vec::Vec::new()vec![];
120 for variant_no in start_idx..=variadic_variants {
121 let expanded = expand_variadic(
122 input.clone(),
123 legacy_helper_type_and_module,
124 generate_return_type_helpers,
125 variadic_argument_count,
126 variant_no,
127 variadic_span,
128 )?;
129
130 if let Some(return_type_helper_module_path) = expanded.return_type_helper_module_path {
131 helper_type_modules.push(return_type_helper_module_path);
132 }
133
134 result.append_all(expanded.tokens);
135 }
136
137 if generate_return_type_helpers {
138 let return_types_module_name = Ident::new(
139 &::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__{0}_return_types",
input.fn_name))
})format!("__{}_return_types", input.fn_name),
140 input.fn_name.span(),
141 );
142 let result = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result, &mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unused_imports");
_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, "doc");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "inline");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "mod");
::quote::ToTokens::to_tokens(&return_types_module_name, &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 helper_type_modules, i) =
helper_type_modules.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let helper_type_modules =
match helper_type_modules.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::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_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "inline");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "super");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&helper_type_modules, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_star(&mut _s);
::quote::__private::push_semi(&mut _s);
}
}
_s
});
_s
}quote! {
143 #result
144
145 #[allow(unused_imports)]
146 #[doc(inline)]
147 mod #return_types_module_name {
148 #(
149 #[doc(inline)]
150 pub use super:: #helper_type_modules ::*;
151 )*
152 }
153 };
154
155 let return_type_helper_module_path = Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&return_types_module_name, &mut _s);
_s
})parse_quote! {
156 #return_types_module_name
157 });
158
159 Ok(ExpandedSqlFunction {
160 tokens: result,
161 return_type_helper_module_path,
162 })
163 } else {
164 Ok(ExpandedSqlFunction {
165 tokens: result,
166 return_type_helper_module_path: None,
167 })
168 }
169}
170
171fn expand_variadic(
172 mut input: SqlFunctionDecl,
173 legacy_helper_type_and_module: bool,
174 generate_return_type_helpers: bool,
175 variadic_argument_count: usize,
176 variant_no: usize,
177 variadic_span: Span,
178) -> syn::Result<ExpandedSqlFunction> {
179 add_variadic_doc_comments(&mut input.attributes, &input.fn_name.to_string());
180
181 let sql_name = parse_sql_name_attr(&mut input);
182
183 input.fn_name = match ::quote::__private::IdentFragmentAdapter(&input.fn_name) {
arg =>
match ::quote::__private::IdentFragmentAdapter(&variant_no) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}_{1}", arg, arg))
}),
::quote::__private::Option::None.or(arg.span()).or(arg.span())),
},
}format_ident!("{}_{}", input.fn_name, variant_no);
184
185 let nonvariadic_args_count = input
186 .args
187 .len()
188 .checked_sub(variadic_argument_count)
189 .ok_or_else(|| {
190 syn::Error::new(
191 variadic_span,
192 "invalid variadic argument count: not enough function arguments",
193 )
194 })?;
195
196 let mut variadic_generic_indexes = ::alloc::vec::Vec::new()vec![];
197 let mut arguments_with_generic_types = ::alloc::vec::Vec::new()vec![];
198 for (arg_idx, arg) in input.args.iter().skip(nonvariadic_args_count).enumerate() {
199 let Type::Path(ty_path) = arg.ty.clone() else {
201 continue;
202 };
203 let Ok(ty_ident) = ty_path.path.require_ident() else {
204 continue;
205 };
206
207 let idx = input.generics.params.iter().position(|param| match param {
208 GenericParam::Type(type_param) => type_param.ident == *ty_ident,
209 _ => false,
210 });
211
212 if let Some(idx) = idx {
213 variadic_generic_indexes.push(idx);
214 arguments_with_generic_types.push(arg_idx);
215 }
216 }
217
218 let mut args: Vec<_> = input.args.into_pairs().collect();
219 let variadic_args = args.split_off(nonvariadic_args_count);
220 let nonvariadic_args = args;
221
222 let variadic_args: Vec<_> = iter::repeat_n(variadic_args, variant_no)
223 .enumerate()
224 .flat_map(|(arg_group_idx, arg_group)| {
225 let mut resulting_args = ::alloc::vec::Vec::new()vec![];
226
227 for (arg_idx, arg) in arg_group.into_iter().enumerate() {
228 let mut arg = arg.into_value();
229
230 arg.name = match ::quote::__private::IdentFragmentAdapter(&arg.name) {
arg =>
match ::quote::__private::IdentFragmentAdapter(&(arg_group_idx + 1)) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}_{1}", arg, arg))
}),
::quote::__private::Option::None.or(arg.span()).or(arg.span())),
},
}format_ident!("{}_{}", arg.name, arg_group_idx + 1);
231
232 if arguments_with_generic_types.contains(&arg_idx) {
233 let Type::Path(mut ty_path) = arg.ty.clone() else {
234 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("This argument should have path type as checked earlier")));
}unreachable!("This argument should have path type as checked earlier")
235 };
236 let Ok(ident) = ty_path.path.require_ident() else {
237 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("This argument should have ident type as checked earlier")));
}unreachable!("This argument should have ident type as checked earlier")
238 };
239
240 ty_path.path.segments[0].ident =
241 match ::quote::__private::IdentFragmentAdapter(&ident) {
arg =>
match ::quote::__private::IdentFragmentAdapter(&(arg_group_idx + 1)) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}{1}", arg, arg))
}),
::quote::__private::Option::None.or(arg.span()).or(arg.span())),
},
}format_ident!("{}{}", ident, arg_group_idx + 1);
242 arg.ty = Type::Path(ty_path);
243 }
244
245 let pair = Pair::new(arg, Some(::syn::token::CommaToken])));
246 resulting_args.push(pair);
247 }
248
249 resulting_args
250 })
251 .collect();
252
253 input.args = nonvariadic_args.into_iter().chain(variadic_args).collect();
254
255 let generics: Vec<_> = input.generics.params.into_pairs().collect();
256 input.generics.params = if variant_no == 0 {
257 generics
258 .into_iter()
259 .enumerate()
260 .filter_map(|(generic_idx, generic)| {
261 (!variadic_generic_indexes.contains(&generic_idx)).then_some(generic)
262 })
263 .collect()
264 } else {
265 iter::repeat_n(generics, variant_no)
266 .enumerate()
267 .flat_map(|(generic_group_idx, generic_group)| {
268 let mut resulting_generics = ::alloc::vec::Vec::new()vec![];
269
270 for (generic_idx, generic) in generic_group.into_iter().enumerate() {
271 if !variadic_generic_indexes.contains(&generic_idx) {
272 if generic_group_idx == 0 {
273 resulting_generics.push(generic);
274 }
275
276 continue;
277 }
278
279 let mut generic = generic.into_value();
280
281 if let GenericParam::Type(type_param) = &mut generic {
282 type_param.ident =
283 match ::quote::__private::IdentFragmentAdapter(&type_param.ident) {
arg =>
match ::quote::__private::IdentFragmentAdapter(&(generic_group_idx +
1)) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}{1}", arg, arg))
}),
::quote::__private::Option::None.or(arg.span()).or(arg.span())),
},
}format_ident!("{}{}", type_param.ident, generic_group_idx + 1);
284 } else {
285 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("This generic should be a type param as checked earlier")));
}unreachable!("This generic should be a type param as checked earlier")
286 }
287
288 let pair = Pair::new(generic, Some(::syn::token::CommaToken])));
289 resulting_generics.push(pair);
290 }
291
292 resulting_generics
293 })
294 .collect()
295 };
296
297 expand_nonvariadic(
298 input,
299 sql_name,
300 legacy_helper_type_and_module,
301 generate_return_type_helpers,
302 )
303}
304
305fn add_variadic_doc_comments(
306 attributes: &mut Vec<AttributeSpanWrapper<SqlFunctionAttribute>>,
307 fn_name: &str,
308) {
309 let doc_comments_end = attributes.len()
310 - attributes
311 .iter()
312 .rev()
313 .position(|attr| #[allow(non_exhaustive_omitted_patterns)] match &attr.item {
SqlFunctionAttribute::Other(syn::Attribute {
meta: Meta::NameValue(MetaNameValue { path, .. }), .. }) if
path.is_ident("doc") => true,
_ => false,
}matches!(&attr.item, SqlFunctionAttribute::Other(syn::Attribute{ meta: Meta::NameValue(MetaNameValue { path, .. }), ..}) if path.is_ident("doc")))
314 .unwrap_or(attributes.len());
315
316 let fn_family = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}_0`, `{0}_1`, ... `{0}_n`",
fn_name))
})format!("`{fn_name}_0`, `{fn_name}_1`, ... `{fn_name}_n`");
317
318 let doc_comments: Vec<Attribute> = ::syn::__private::parse_quote({
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::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" # Variadic functions\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function is variadic in SQL, so there\'s a family of functions\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\" on a diesel side:\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&fn_family, &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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Here, the postfix number indicates repetitions of variadic arguments.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" To use this function, the appropriate version with the correct\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" argument count must be selected.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" ## Controlling the generation of variadic function variants\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" By default, only variants with 0, 1, and 2 repetitions of variadic\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" arguments are generated. To generate more variants, set the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" `DIESEL_VARIADIC_FUNCTION_ARGS` environment variable to the desired\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" number of variants.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" For a greater convenience this environment variable can also be set\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" in a `.cargo/config.toml` file as described in the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [cargo documentation](https://doc.rust-lang.org/cargo/reference/config.html#env).\"");
_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, "doc");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "alias");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
_s
});
_s
});
_s
})parse_quote! {
319 #[doc = #fn_family]
326 #[doc(alias = #fn_name)]
342 };
343
344 for (doc_comments_end, new_attribute) in
345 (attributes.len() - doc_comments_end..).zip(doc_comments)
346 {
347 attributes.insert(
348 doc_comments_end,
349 AttributeSpanWrapper {
350 item: SqlFunctionAttribute::Other(new_attribute),
351 attribute_span: Span::mixed_site(),
352 ident_span: Span::mixed_site(),
353 },
354 );
355 }
356}
357
358fn parse_sql_name_attr(input: &mut SqlFunctionDecl) -> String {
359 input
360 .attributes
361 .iter()
362 .find_map(|attr| match attr.item {
363 SqlFunctionAttribute::SqlName { ref value, .. } => Some(value.value()),
364 _ => None,
365 })
366 .unwrap_or_else(|| input.fn_name.to_string())
367}
368
369fn expand_nonvariadic(
370 input: SqlFunctionDecl,
371 sql_name: String,
372 legacy_helper_type_and_module: bool,
373 generate_return_type_helpers: bool,
374) -> syn::Result<ExpandedSqlFunction> {
375 let SqlFunctionDecl {
376 attributes,
377 fn_token,
378 fn_name,
379 mut generics,
380 args,
381 return_type,
382 } = input;
383
384 let is_aggregate = attributes
385 .iter()
386 .any(|attr| #[allow(non_exhaustive_omitted_patterns)] match attr.item {
SqlFunctionAttribute::Aggregate { .. } => true,
_ => false,
}matches!(attr.item, SqlFunctionAttribute::Aggregate { .. }));
387
388 let can_be_called_directly = !function_cannot_be_called_directly(&attributes);
389
390 let skip_return_type_helper = attributes
391 .iter()
392 .any(|attr| #[allow(non_exhaustive_omitted_patterns)] match attr.item {
SqlFunctionAttribute::SkipReturnTypeHelper { .. } => true,
_ => false,
}matches!(attr.item, SqlFunctionAttribute::SkipReturnTypeHelper { .. }));
393
394 let window_attrs = attributes
395 .iter()
396 .filter(|a| #[allow(non_exhaustive_omitted_patterns)] match a.item {
SqlFunctionAttribute::Window { .. } => true,
_ => false,
}matches!(a.item, SqlFunctionAttribute::Window { .. }))
397 .cloned()
398 .collect::<Vec<_>>();
399
400 let restrictions = attributes
401 .iter()
402 .find_map(|a| match a.item {
403 SqlFunctionAttribute::Restriction {
404 ref restriction, ..
405 } => Some(restriction.clone()),
406 _ => None,
407 })
408 .unwrap_or_default();
409
410 let attributes = attributes
411 .into_iter()
412 .filter_map(|a| match a.item {
413 SqlFunctionAttribute::Other(a) => Some(a),
414 _ => None,
415 })
416 .collect::<Vec<_>>();
417
418 let (ref arg_name, ref arg_type): (Vec<_>, Vec<_>) = args
419 .iter()
420 .map(|StrictFnArg { name, ty, .. }| (name, ty))
421 .unzip();
422 let arg_struct_assign = args.iter().map(
423 |StrictFnArg {
424 name, colon_token, ..
425 }| {
426 let name2 = name.clone();
427 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::ToTokens::to_tokens(&colon_token, &mut _s);
::quote::ToTokens::to_tokens(&name2, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "as_expression");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
}quote!(#name #colon_token #name2.as_expression())
428 },
429 );
430
431 let type_args = &generics
432 .type_params()
433 .map(|type_param| type_param.ident.clone())
434 .collect::<Vec<_>>();
435
436 for StrictFnArg { name, .. } in &args {
437 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&name, &mut _s);
_s
})parse_quote!(#name));
438 }
439
440 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
441 let where_clause = where_clause
444 .map(|w| {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&w, &mut _s);
_s
}quote!(#w))
445 .unwrap_or_else(|| {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "where");
_s
}quote!(where));
446
447 let mut generics_with_internal = generics.clone();
448 generics_with_internal
449 .params
450 .push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal));
451 let (impl_generics_internal, _, _) = generics_with_internal.split_for_impl();
452
453 let sql_type;
454 let numeric_derive;
455
456 if arg_name.is_empty() {
457 sql_type = None;
458 numeric_derive = None;
460 } else {
461 sql_type = Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
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 arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
}
}
_s
});
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "Expression");
::quote::__private::push_comma(&mut _s);
_s
}quote!((#(#arg_name),*): Expression,));
462 numeric_derive = Some({
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, "derive");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sql_types");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "DieselNumericOps");
_s
});
_s
});
_s
}quote!(#[derive(diesel::sql_types::DieselNumericOps)]));
463 }
464
465 let helper_type_doc = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("The return type of [`{0}()`](fn@{0})",
fn_name))
})format!("The return type of [`{fn_name}()`](fn@{fn_name})");
466 let query_fragment_impl =
467 can_be_called_directly.then_some(restrictions.generate_all_queryfragment_impls(
468 generics.clone(),
469 &ty_generics,
470 arg_name,
471 &fn_name,
472 ));
473
474 let args_iter = args.iter();
475 let mut tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&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_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expression");
::quote::__private::push_colon2(&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, "AsExpression");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Expression");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "SelectableExpression");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "AppearsOnTable");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "ValidGrouping");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "query_builder");
::quote::__private::push_colon2(&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, "QueryFragment");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "AstPass");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sql_types");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_star(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_star(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_ident(&mut _s, "super");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_star(&mut _s);
::quote::__private::push_semi(&mut _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");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Copy");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "query_builder");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryId");
_s
});
_s
});
::quote::ToTokens::to_tokens(&numeric_derive, &mut _s);
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "struct");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &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 args_iter, i) = args_iter.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let args_iter =
match args_iter.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "in");
::quote::__private::push_ident(&mut _s, "super");
_s
});
::quote::ToTokens::to_tokens(&args_iter, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut type_args, i) = type_args.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut type_args, i) = type_args.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let type_args =
match type_args.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let type_args =
match type_args.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "in");
::quote::__private::push_ident(&mut _s, "super");
_s
});
::quote::ToTokens::to_tokens(&type_args, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::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");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&type_args, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&helper_type_doc, &mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "type");
::quote::__private::push_ident(&mut _s, "HelperType");
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::__private::push_lt(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut type_args, i) = type_args.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let type_args =
match type_args.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&type_args, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "AsExpression");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Expression");
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "Expression");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::ToTokens::to_tokens(&sql_type, &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, "type");
::quote::__private::push_ident(&mut _s, "SqlType");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_semi(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
::quote::__private::push_ident(&mut _s, "SelectableExpression");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "SelectableExpression");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "AppearsOnTable");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
::quote::__private::push_ident(&mut _s, "AppearsOnTable");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "AppearsOnTable");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "Expression");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
::quote::__private::push_ident(&mut _s, "FunctionFragment");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryFragment");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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, "const");
::quote::__private::push_ident(&mut _s, "FUNCTION_NAME");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_ident(&mut _s, "str");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&sql_name, &mut _s);
::quote::__private::push_semi(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"unused_assignments");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "walk_arguments");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'__b");
::quote::__private::push_gt(&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_lifetime(&mut _s, "\'__b");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "AstPass");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'__b");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::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_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "needs_comma");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "false");
::quote::__private::push_semi(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "is_noop");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_question(&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, "if");
::quote::__private::push_ident(&mut _s, "needs_comma");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "push_sql");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s, "\", \"");
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "walk_ast");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "reborrow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_question(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "needs_comma");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "true");
::quote::__private::push_semi(&mut _s);
_s
});
}
}
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
});
::quote::ToTokens::to_tokens(&query_fragment_impl, &mut _s);
_s
}quote! {
476 use diesel::{self, QueryResult};
477 use diesel::expression::{AsExpression, Expression, SelectableExpression, AppearsOnTable, ValidGrouping};
478 use diesel::query_builder::{QueryFragment, AstPass};
479 use diesel::sql_types::*;
480 use diesel::internal::sql_functions::*;
481 use super::*;
482
483 #[derive(Debug, Clone, Copy, diesel::query_builder::QueryId)]
484 #numeric_derive
485 pub struct #fn_name #ty_generics {
486 #(pub(in super) #args_iter,)*
487 #(pub(in super) #type_args: ::core::marker::PhantomData<#type_args>,)*
488 }
489
490 #[doc = #helper_type_doc]
491 pub type HelperType #ty_generics = #fn_name <
492 #(#type_args,)*
493 #(<#arg_name as AsExpression<#arg_type>>::Expression,)*
494 >;
495
496 impl #impl_generics Expression for #fn_name #ty_generics
497 #where_clause
498 #sql_type
499 {
500 type SqlType = #return_type;
501 }
502
503 impl #impl_generics_internal SelectableExpression<__DieselInternal>
505 for #fn_name #ty_generics
506 #where_clause
507 #(#arg_name: SelectableExpression<__DieselInternal>,)*
508 Self: AppearsOnTable<__DieselInternal>,
509 {
510 }
511
512 impl #impl_generics_internal AppearsOnTable<__DieselInternal>
514 for #fn_name #ty_generics
515 #where_clause
516 #(#arg_name: AppearsOnTable<__DieselInternal>,)*
517 Self: Expression,
518 {
519 }
520
521 impl #impl_generics_internal FunctionFragment<__DieselInternal>
522 for #fn_name #ty_generics
523 where
524 __DieselInternal: diesel::backend::Backend,
525 #(#arg_name: QueryFragment<__DieselInternal>,)*
526 {
527 const FUNCTION_NAME: &'static str = #sql_name;
528
529 #[allow(unused_assignments)]
530 fn walk_arguments<'__b>(&'__b self, mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
531 let mut needs_comma = false;
533 #(
534 if !self.#arg_name.is_noop(out.backend())? {
535 if needs_comma {
536 out.push_sql(", ");
537 }
538 self.#arg_name.walk_ast(out.reborrow())?;
539 needs_comma = true;
540 }
541 )*
542 Ok(())
543 }
544 }
545
546 #query_fragment_impl
547 };
548
549 for window in &window_attrs {
550 tokens.extend(generate_window_function_tokens(
551 window,
552 generics.clone(),
553 &ty_generics,
554 &fn_name,
555 ));
556 }
557 if !window_attrs.is_empty() {
558 tokens.extend({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "IsWindowFunction");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &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, "type");
::quote::__private::push_ident(&mut _s, "ArgTypes");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote::quote! {
559 impl #impl_generics IsWindowFunction for #fn_name #ty_generics {
560 type ArgTypes = (#(#arg_name,)*);
561 }
562 });
563 }
564
565 if is_aggregate {
566 tokens = generate_tokens_for_aggregate_functions(
567 tokens,
568 &impl_generics_internal,
569 &impl_generics,
570 &fn_name,
571 &ty_generics,
572 arg_name,
573 arg_type,
574 !window_attrs.is_empty(),
575 &return_type,
576 &sql_name,
577 );
578 } else if window_attrs.is_empty() {
579 tokens = generate_tokens_for_non_aggregate_functions(
580 tokens,
581 &impl_generics_internal,
582 &fn_name,
583 &ty_generics,
584 arg_name,
585 arg_type,
586 &return_type,
587 &sql_name,
588 );
589 }
590
591 let args_iter = args.iter();
592
593 let (outside_of_module_helper_type, return_type_path, internals_module_name) =
594 if legacy_helper_type_and_module {
595 (None, {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "HelperType");
_s
}quote! { #fn_name::HelperType }, fn_name.clone())
596 } else {
597 let internals_module_name = Ident::new(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}_utils", fn_name))
})format!("{fn_name}_utils"), fn_name.span());
598 (
599 Some({
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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"non_camel_case_types");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "non_snake_case");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&helper_type_doc, &mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "type");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&internals_module_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::__private::push_lt(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut type_args, i) = type_args.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let type_args =
match type_args.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&type_args, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expression");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsExpression");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Expression");
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&mut _s);
::quote::__private::push_semi(&mut _s);
_s
}quote! {
600 #[allow(non_camel_case_types, non_snake_case)]
601 #[doc = #helper_type_doc]
602 pub type #fn_name #ty_generics = #internals_module_name::#fn_name <
603 #(#type_args,)*
604 #(<#arg_name as diesel::expression::AsExpression<#arg_type>>::Expression,)*
605 >;
606 }),
607 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
_s
}quote! { #fn_name },
608 internals_module_name,
609 )
610 };
611
612 let (return_type_helper_module, return_type_helper_module_path) =
613 if !generate_return_type_helpers || skip_return_type_helper {
614 (None, None)
615 } else {
616 let auto_derived_types = type_args
617 .iter()
618 .map(|type_arg| {
619 for arg in &args {
620 let Type::Path(path) = &arg.ty else {
621 continue;
622 };
623
624 let Some(path_ident) = path.path.get_ident() else {
625 continue;
626 };
627
628 if path_ident == type_arg {
629 return Ok(arg.name.clone());
630 }
631 }
632
633 Err(syn::Error::new(
634 type_arg.span(),
635 "cannot find argument corresponding to the generic",
636 ))
637 })
638 .collect::<Result<Vec<_>>>()?;
639
640 let arg_names_iter: Vec<_> = args.iter().map(|arg| arg.name.clone()).collect();
641
642 let return_type_module_name =
643 Ident::new(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__{0}_return_type", fn_name))
})format!("__{fn_name}_return_type"), fn_name.span());
644
645 let doc =
646 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Return type of the [`{0}()`](fn@super::{0}) SQL function.",
fn_name))
})format!("Return type of the [`{fn_name}()`](fn@super::{fn_name}) SQL function.");
647 let return_type_helper_module = {
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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"non_camel_case_types");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "non_snake_case");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unused_imports");
_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, "doc");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "inline");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "mod");
::quote::ToTokens::to_tokens(&return_type_module_name, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
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_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "type");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::__private::push_lt(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_names_iter, i) =
arg_names_iter.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_names_iter =
match arg_names_iter.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_names_iter, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "super");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::__private::push_lt(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut auto_derived_types, i) =
auto_derived_types.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let auto_derived_types =
match auto_derived_types.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&auto_derived_types, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expression");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Expression");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqlType");
::quote::__private::push_comma(&mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_names_iter, i) =
arg_names_iter.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_names_iter =
match arg_names_iter.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_names_iter, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&mut _s);
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
648 #[allow(non_camel_case_types, non_snake_case, unused_imports)]
649 #[doc(inline)]
650 mod #return_type_module_name {
651 #[doc = #doc]
652 pub type #fn_name<
653 #(#arg_names_iter,)*
654 > = super::#fn_name<
655 #( <#auto_derived_types as diesel::expression::Expression>::SqlType, )*
656 #(#arg_names_iter,)*
657 >;
658 }
659 };
660
661 let module_path = ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&return_type_module_name, &mut _s);
_s
})parse_quote!(
662 #return_type_module_name
663 );
664
665 (Some(return_type_helper_module), Some(module_path))
666 };
667
668 let tokens = {
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut attributes, i) = attributes.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let attributes =
match attributes.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&attributes, &mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"non_camel_case_types");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::ToTokens::to_tokens(&fn_token, &mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut args_iter, i) = args_iter.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let args_iter =
match args_iter.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&args_iter, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::ToTokens::to_tokens(&return_type_path, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expression");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsExpression");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&internals_module_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &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 arg_struct_assign, i) =
arg_struct_assign.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_struct_assign =
match arg_struct_assign.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_struct_assign, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut type_args, i) = type_args.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let type_args =
match type_args.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&type_args, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::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");
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
});
::quote::ToTokens::to_tokens(&outside_of_module_helper_type, &mut _s);
::quote::ToTokens::to_tokens(&return_type_helper_module, &mut _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, "doc");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "hidden");
_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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"non_camel_case_types");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "non_snake_case");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unused_imports");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "crate");
_s
});
::quote::__private::push_ident(&mut _s, "mod");
::quote::ToTokens::to_tokens(&internals_module_name, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&tokens, &mut _s);
_s
});
_s
}quote! {
669 #(#attributes)*
670 #[allow(non_camel_case_types)]
671 pub #fn_token #fn_name #impl_generics (#(#args_iter,)*)
672 -> #return_type_path #ty_generics
673 #where_clause
674 #(#arg_name: diesel::expression::AsExpression<#arg_type>,)*
675 {
676 #internals_module_name::#fn_name {
677 #(#arg_struct_assign,)*
678 #(#type_args: ::core::marker::PhantomData,)*
679 }
680 }
681
682 #outside_of_module_helper_type
683
684 #return_type_helper_module
685
686 #[doc(hidden)]
687 #[allow(non_camel_case_types, non_snake_case, unused_imports)]
688 pub(crate) mod #internals_module_name {
689 #tokens
690 }
691 };
692
693 Ok(ExpandedSqlFunction {
694 tokens,
695 return_type_helper_module_path,
696 })
697}
698
699fn generate_window_function_tokens(
700 window: &AttributeSpanWrapper<SqlFunctionAttribute>,
701 generics: Generics,
702 ty_generics: &TypeGenerics<'_>,
703 fn_name: &Ident,
704) -> TokenStream {
705 let SqlFunctionAttribute::Window {
706 restrictions,
707 require_order,
708 wrap_macro,
709 ..
710 } = &window.item
711 else {
712 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("We filtered for window attributes above")));
}unreachable!("We filtered for window attributes above")
713 };
714 restrictions.generate_all_window_fragment_impls(
715 generics,
716 ty_generics,
717 fn_name,
718 require_order.unwrap_or_default(),
719 wrap_macro.as_ref(),
720 )
721}
722
723#[allow(clippy::too_many_arguments)]
724fn generate_tokens_for_non_aggregate_functions(
725 mut tokens: TokenStream,
726 impl_generics_internal: &syn::ImplGenerics<'_>,
727 fn_name: &syn::Ident,
728 ty_generics: &syn::TypeGenerics<'_>,
729 arg_name: &[&syn::Ident],
730 arg_type: &[&syn::Type],
731 return_type: &syn::Type,
732 sql_name: &str,
733) -> TokenStream {
734 tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&tokens, &mut _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, "ValidGrouping");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "struct");
::quote::__private::push_ident(&mut _s, "__Derived");
::quote::__private::push_lt(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
::quote::__private::push_ident(&mut _s, "ValidGrouping");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "__Derived");
::quote::__private::push_lt(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "ValidGrouping");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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, "type");
::quote::__private::push_ident(&mut _s, "IsAggregate");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__Derived");
::quote::__private::push_lt(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "ValidGrouping");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IsAggregate");
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
735 #tokens
736
737 #[derive(ValidGrouping)]
738 pub struct __Derived<#(#arg_name,)*>(#(#arg_name,)*);
739
740 impl #impl_generics_internal ValidGrouping<__DieselInternal>
741 for #fn_name #ty_generics
742 where
743 __Derived<#(#arg_name,)*>: ValidGrouping<__DieselInternal>,
744 {
745 type IsAggregate = <__Derived<#(#arg_name,)*> as ValidGrouping<__DieselInternal>>::IsAggregate;
746 }
747 };
748 let (contains_none, types_for_sqlite_impl) =
749 collect_types_for_sqlite_impl(arg_type, return_type);
750
751 if !contains_none && !arg_name.is_empty() {
752 tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&tokens, &mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this function on the given connection.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. The implementation must be\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" deterministic (returns the same result given the same arguments). If\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" the function is nondeterministic, call\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_nondeterministic_impl`](self::register_nondeterministic_impl)\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" instead, or [`register_impl_with_behavior`](self::register_impl_with_behavior)\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" for full control over the SQLite behavior flags.\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "register_impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "Fn");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromSqlRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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,
"register_impl_with_behavior");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "conn");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "DETERMINISTIC");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers a nondeterministic implementation for this function on the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" given connection.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" `register_nondeterministic_impl` should only be used if your\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" function can return different results with the same arguments (e.g.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" `random`). If your function is deterministic, you should call\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl`](self::register_impl) instead. For full control over\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" the SQLite behavior flags, use\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl_with_behavior`](self::register_impl_with_behavior).\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"register_nondeterministic_impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "FnMut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromSqlRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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,
"register_impl_with_behavior");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "conn");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "empty");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this function on the given connection,\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" with explicit control over the SQLite behavior flags.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. Prefer\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl`](self::register_impl) (deterministic) or\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_nondeterministic_impl`](self::register_nondeterministic_impl)\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" unless you need to set behavior flags explicitly. See\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`SqliteFunctionBehavior`] for the available flags.\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"register_impl_with_behavior");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "FnMut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromSqlRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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, "conn");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"register_sql_function");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&sql_name, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "move");
::quote::__private::push_or(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
_s
}quote! {
753 #tokens
754
755 diesel::internal::sql_functions::expand_sqlite_function!{
756 [#(#types_for_sqlite_impl,)*],
757
758 #[allow(dead_code)]
759 pub fn register_impl<F, Ret, #(#arg_name,)*>(
769 conn: &mut diesel::sqlite::SqliteConnection,
770 f: F,
771 ) -> diesel::result::QueryResult<()>
772 where
773 F: Fn(#(#arg_name,)*) -> Ret + ::core::panic::UnwindSafe + Send + 'static,
774 (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
775 diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite>,
776 Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
777 {
778 register_impl_with_behavior(
779 conn,
780 diesel::sqlite::SqliteFunctionBehavior::DETERMINISTIC,
781 f,
782 )
783 }
784 }
785 diesel::internal::sql_functions::expand_sqlite_function!{
786 [#(#types_for_sqlite_impl,)*],
787
788 #[allow(dead_code)]
789 pub fn register_nondeterministic_impl<F, Ret, #(#arg_name,)*>(
801 conn: &mut diesel::sqlite::SqliteConnection,
802 f: F,
803 ) -> diesel::result::QueryResult<()>
804 where
805 F: FnMut(#(#arg_name,)*) -> Ret + ::core::panic::UnwindSafe + Send + 'static,
806 (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
807 diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite>,
808 Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
809 {
810 register_impl_with_behavior(
811 conn,
812 diesel::sqlite::SqliteFunctionBehavior::empty(),
813 f,
814 )
815 }
816 }
817 diesel::internal::sql_functions::expand_sqlite_function!{
818 [#(#types_for_sqlite_impl,)*],
819
820 #[allow(dead_code)]
821 pub fn register_impl_with_behavior<F, Ret, #(#arg_name,)*>(
831 conn: &mut diesel::sqlite::SqliteConnection,
832 behavior: diesel::sqlite::SqliteFunctionBehavior,
833 mut f: F,
834 ) -> diesel::result::QueryResult<()>
835 where
836 F: FnMut(#(#arg_name,)*) -> Ret + ::core::panic::UnwindSafe + Send + 'static,
837 (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
838 diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite>,
839 Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
840 {
841 conn.register_sql_function::<(#(#arg_type,)*), #return_type, _, _, _>(
842 #sql_name,
843 behavior,
844 move |(#(#arg_name,)*)| f(#(#arg_name,)*),
845 )
846 }
847 }
848 };
849 }
850
851 if !contains_none && arg_name.is_empty() {
852 tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&tokens, &mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this function on the given connection.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. The implementation must be\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" deterministic (returns the same result given the same arguments). If\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" the function is nondeterministic, call\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_nondeterministic_impl`](self::register_nondeterministic_impl)\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" instead, or [`register_impl_with_behavior`](self::register_impl_with_behavior)\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" for full control over the SQLite behavior flags.\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "register_impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "Fn");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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,
"register_impl_with_behavior");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "conn");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "DETERMINISTIC");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers a nondeterministic implementation for this function on the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" given connection.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" `register_nondeterministic_impl` should only be used if your\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" function can return different results with the same arguments (e.g.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" `random`). If your function is deterministic, you should call\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl`](self::register_impl) instead. For full control over\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" the SQLite behavior flags, use\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl_with_behavior`](self::register_impl_with_behavior).\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"register_nondeterministic_impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "FnMut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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,
"register_impl_with_behavior");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "conn");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "empty");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this function on the given connection,\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" with explicit control over the SQLite behavior flags.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. Prefer\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl`](self::register_impl) (deterministic) or\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_nondeterministic_impl`](self::register_nondeterministic_impl)\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" unless you need to set behavior flags explicitly. See\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`SqliteFunctionBehavior`] for the available flags.\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"register_impl_with_behavior");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "F");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "FnMut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "Ret");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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, "conn");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"register_noarg_sql_function");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&sql_name, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "f");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
_s
}quote! {
853 #tokens
854 diesel::internal::sql_functions::expand_sqlite_function!{
855 [#(#types_for_sqlite_impl,)*],
856
857 #[allow(dead_code)]
858 pub fn register_impl<F, Ret>(
868 conn: &mut diesel::sqlite::SqliteConnection,
869 f: F,
870 ) -> diesel::result::QueryResult<()>
871 where
872 F: Fn() -> Ret + ::core::panic::UnwindSafe + Send + 'static,
873 Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
874 {
875 register_impl_with_behavior(
876 conn,
877 diesel::sqlite::SqliteFunctionBehavior::DETERMINISTIC,
878 f,
879 )
880 }
881 }
882 diesel::internal::sql_functions::expand_sqlite_function!{
883 [#(#types_for_sqlite_impl,)*],
884
885 #[allow(dead_code)]
886 pub fn register_nondeterministic_impl<F, Ret>(
898 conn: &mut diesel::sqlite::SqliteConnection,
899 f: F,
900 ) -> diesel::result::QueryResult<()>
901 where
902 F: FnMut() -> Ret + ::core::panic::UnwindSafe + Send + 'static,
903 Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
904 {
905 register_impl_with_behavior(
906 conn,
907 diesel::sqlite::SqliteFunctionBehavior::empty(),
908 f,
909 )
910 }
911 }
912 diesel::internal::sql_functions::expand_sqlite_function!{
913 [#(#types_for_sqlite_impl,)*],
914
915 #[allow(dead_code)]
916 pub fn register_impl_with_behavior<F, Ret>(
926 conn: &mut diesel::sqlite::SqliteConnection,
927 behavior: diesel::sqlite::SqliteFunctionBehavior,
928 f: F,
929 ) -> diesel::result::QueryResult<()>
930 where
931 F: FnMut() -> Ret + ::core::panic::UnwindSafe + Send + 'static,
932 Ret: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
933 {
934 conn.register_noarg_sql_function::<#return_type, _, _>(
935 #sql_name,
936 behavior,
937 f,
938 )
939 }
940 }
941 };
942 }
943 tokens
944}
945
946fn collect_types_for_sqlite_impl<'a>(
947 arg_type: &[&'a Type],
948 return_type: &'a Type,
949) -> (bool, Vec<&'a Ident>) {
950 let mut contains_none = false;
951 let types_for_sqlite_impl = std::iter::once(return_type)
952 .chain(arg_type.iter().copied())
953 .filter_map(|t| {
954 let r = is_sqlite_type(t);
955 contains_none = contains_none || r.is_none();
956 r
957 })
958 .collect::<Vec<_>>();
959 (contains_none, types_for_sqlite_impl)
960}
961
962#[allow(clippy::too_many_arguments)]
963fn generate_tokens_for_aggregate_functions(
964 mut tokens: TokenStream,
965 impl_generics_internal: &syn::ImplGenerics<'_>,
966 impl_generics: &syn::ImplGenerics<'_>,
967 fn_name: &syn::Ident,
968 ty_generics: &syn::TypeGenerics<'_>,
969 arg_name: &[&syn::Ident],
970 arg_type: &[&syn::Type],
971 is_window: bool,
972 return_type: &syn::Type,
973 sql_name: &str,
974) -> TokenStream {
975 tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&tokens, &mut _s);
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics_internal, &mut _s);
::quote::__private::push_ident(&mut _s, "ValidGrouping");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &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, "type");
::quote::__private::push_ident(&mut _s, "IsAggregate");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expression");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "is_aggregate");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Yes");
::quote::__private::push_semi(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "IsAggregateFunction");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote! {
976 #tokens
977
978 impl #impl_generics_internal ValidGrouping<__DieselInternal>
979 for #fn_name #ty_generics
980 {
981 type IsAggregate = diesel::expression::is_aggregate::Yes;
982 }
983
984 impl #impl_generics IsAggregateFunction for #fn_name #ty_generics {}
985 };
986
987 let (contains_none, types_for_sqlite_impl) =
988 collect_types_for_sqlite_impl(arg_type, return_type);
989 let types_for_sqlite_impl = &types_for_sqlite_impl;
990
991 if !contains_none && !is_window {
993 match arg_name.len() {
1007 x if x > 1 => {
1008 tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&tokens, &mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this aggregate function on the given connection.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. For full control over\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" the SQLite behavior flags, use\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl_with_behavior`](self::register_impl_with_behavior).\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "register_impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteAggregateFunction");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "RefUnwindSafe");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Output");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromSqlRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_comma(&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,
"register_impl_with_behavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "empty");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this aggregate function on the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" given connection, with explicit control over the SQLite behavior flags.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. Prefer\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl`](self::register_impl) unless you need to set\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" behavior flags explicitly. See [`SqliteFunctionBehavior`] for the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" available flags.\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"register_impl_with_behavior");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_comma(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteAggregateFunction");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "RefUnwindSafe");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Output");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromSqlRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_comma(&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, "conn");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"register_aggregate_function");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_type, i) = arg_type.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_type =
match arg_type.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&sql_name, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
_s
});
_s
});
_s
});
_s
}quote! {
1009 #tokens
1010 diesel::internal::sql_functions::expand_sqlite_function! {
1011 [#(#types_for_sqlite_impl,)*],
1012 #[allow(dead_code)]
1013 pub fn register_impl<A, #(#arg_name,)*>(
1020 conn: &mut diesel::sqlite::SqliteConnection,
1021 ) -> diesel::result::QueryResult<()>
1022 where
1023 A: diesel::sqlite::SqliteAggregateFunction<(#(#arg_name,)*)>
1024 + Send
1025 + 'static
1026 + ::core::panic::UnwindSafe
1027 + ::core::panic::RefUnwindSafe,
1028 A::Output: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
1029 (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
1030 diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
1031 ::core::panic::UnwindSafe,
1032 {
1033 register_impl_with_behavior::<A, #(#arg_name,)*>(
1034 conn,
1035 diesel::sqlite::SqliteFunctionBehavior::empty(),
1036 )
1037 }
1038 }
1039 diesel::internal::sql_functions::expand_sqlite_function! {
1040 [#(#types_for_sqlite_impl,)*],
1041 #[allow(dead_code)]
1042 pub fn register_impl_with_behavior<A, #(#arg_name,)*>(
1051 conn: &mut diesel::sqlite::SqliteConnection,
1052 behavior: diesel::sqlite::SqliteFunctionBehavior,
1053 ) -> diesel::result::QueryResult<()>
1054 where
1055 A: diesel::sqlite::SqliteAggregateFunction<(#(#arg_name,)*)>
1056 + Send
1057 + 'static
1058 + ::core::panic::UnwindSafe
1059 + ::core::panic::RefUnwindSafe,
1060 A::Output: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
1061 (#(#arg_name,)*): diesel::deserialize::FromSqlRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
1062 diesel::deserialize::StaticallySizedRow<(#(#arg_type,)*), diesel::sqlite::Sqlite> +
1063 ::core::panic::UnwindSafe,
1064 {
1065 conn.register_aggregate_function::<(#(#arg_type,)*), #return_type, _, _, A>(#sql_name, behavior)
1066 }
1067 }
1068 };
1069 }
1070 1 => {
1071 let arg_name = arg_name[0];
1072 let arg_type = arg_type[0];
1073
1074 tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&tokens, &mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this aggregate function on the given connection.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. For full control over\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" the SQLite behavior flags, use\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl_with_behavior`](self::register_impl_with_behavior).\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "register_impl");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteAggregateFunction");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "RefUnwindSafe");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Output");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromSqlRow");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_comma(&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,
"register_impl_with_behavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "empty");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite_function");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut types_for_sqlite_impl, i) =
types_for_sqlite_impl.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let types_for_sqlite_impl =
match types_for_sqlite_impl.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&types_for_sqlite_impl,
&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" Registers an implementation for this aggregate function on the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" given connection, with explicit control over the SQLite behavior flags.\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "r\"\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" This function must be called for every `SqliteConnection` before\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" this SQL function can be used on SQLite. Prefer\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" [`register_impl`](self::register_impl) unless you need to set\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" behavior flags explicitly. See [`SqliteFunctionBehavior`] for the\"");
_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, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s,
"r\" available flags.\"");
_s
});
::quote::__private::push_ident(&mut _s, "pub");
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"register_impl_with_behavior");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_gt(&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, "conn");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqliteConnection");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteFunctionBehavior");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"SqliteAggregateFunction");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "Send");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "RefUnwindSafe");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Output");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ToSql");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromSqlRow");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "StaticallySizedRow");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sqlite");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Sqlite");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_add(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "panic");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UnwindSafe");
::quote::__private::push_comma(&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, "conn");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"register_aggregate_function");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&arg_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&return_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "A");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&sql_name, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "behavior");
_s
});
_s
});
_s
});
_s
}quote! {
1075 #tokens
1076
1077 diesel::internal::sql_functions::expand_sqlite_function! {
1078 [#(#types_for_sqlite_impl,)*],
1079 #[allow(dead_code)]
1080 pub fn register_impl<A, #arg_name>(
1087 conn: &mut diesel::sqlite::SqliteConnection,
1088 ) -> diesel::result::QueryResult<()>
1089 where
1090 A: diesel::sqlite::SqliteAggregateFunction<#arg_name>
1091 + Send
1092 + 'static
1093 + ::core::panic::UnwindSafe
1094 + ::core::panic::RefUnwindSafe,
1095 A::Output: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
1096 #arg_name: diesel::deserialize::FromSqlRow<#arg_type, diesel::sqlite::Sqlite> +
1097 diesel::deserialize::StaticallySizedRow<#arg_type, diesel::sqlite::Sqlite> +
1098 ::core::panic::UnwindSafe,
1099 {
1100 register_impl_with_behavior::<A, #arg_name>(
1101 conn,
1102 diesel::sqlite::SqliteFunctionBehavior::empty(),
1103 )
1104 }
1105 }
1106 diesel::internal::sql_functions::expand_sqlite_function! {
1107 [#(#types_for_sqlite_impl,)*],
1108 #[allow(dead_code)]
1109 pub fn register_impl_with_behavior<A, #arg_name>(
1118 conn: &mut diesel::sqlite::SqliteConnection,
1119 behavior: diesel::sqlite::SqliteFunctionBehavior,
1120 ) -> diesel::result::QueryResult<()>
1121 where
1122 A: diesel::sqlite::SqliteAggregateFunction<#arg_name>
1123 + Send
1124 + 'static
1125 + ::core::panic::UnwindSafe
1126 + ::core::panic::RefUnwindSafe,
1127 A::Output: diesel::serialize::ToSql<#return_type, diesel::sqlite::Sqlite>,
1128 #arg_name: diesel::deserialize::FromSqlRow<#arg_type, diesel::sqlite::Sqlite> +
1129 diesel::deserialize::StaticallySizedRow<#arg_type, diesel::sqlite::Sqlite> +
1130 ::core::panic::UnwindSafe,
1131 {
1132 conn.register_aggregate_function::<#arg_type, #return_type, _, _, A>(#sql_name, behavior)
1133 }
1134 }
1135 };
1136 }
1137 _ => (),
1138 }
1139 }
1140 tokens
1141}
1142
1143fn function_cannot_be_called_directly(
1144 attributes: &[AttributeSpanWrapper<SqlFunctionAttribute>],
1145) -> bool {
1146 let mut has_aggregate = false;
1147 let mut has_window = false;
1148 for attr in attributes {
1149 has_aggregate =
1150 has_aggregate || #[allow(non_exhaustive_omitted_patterns)] match attr.item {
SqlFunctionAttribute::Aggregate { .. } => true,
_ => false,
}matches!(attr.item, SqlFunctionAttribute::Aggregate { .. });
1151 has_window = has_window || #[allow(non_exhaustive_omitted_patterns)] match attr.item {
SqlFunctionAttribute::Window { .. } => true,
_ => false,
}matches!(attr.item, SqlFunctionAttribute::Window { .. });
1152 }
1153 has_window && !has_aggregate
1154}
1155
1156pub(crate) struct ExternSqlBlock {
1157 pub(crate) function_decls: Vec<SqlFunctionDecl>,
1158}
1159
1160impl Parse for ExternSqlBlock {
1161 fn parse(input: ParseStream) -> Result<Self> {
1162 let mut error = None::<syn::Error>;
1163
1164 let mut combine_error = |e: syn::Error| {
1165 error = Some(
1166 error
1167 .take()
1168 .map(|mut o| {
1169 o.combine(e.clone());
1170 o
1171 })
1172 .unwrap_or(e),
1173 )
1174 };
1175
1176 let block = syn::ItemForeignMod::parse(input)?;
1177 if block.abi.name.as_ref().map(|n| n.value()) != Some("SQL".into()) {
1178 return Err(syn::Error::new(block.abi.span(), "expect `SQL` as ABI"));
1179 }
1180 if let Some(unsafety) = block.unsafety {
1181 return Err(syn::Error::new(
1182 unsafety.span(),
1183 "expect `SQL` function blocks to be safe",
1184 ));
1185 }
1186
1187 let parsed_block_attrs = parse_attributes(&mut combine_error, block.attrs);
1188
1189 let item_count = block.items.len();
1190 let function_decls_input = block
1191 .items
1192 .into_iter()
1193 .map(|i| syn::parse2::<SqlFunctionDecl>({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&i, &mut _s);
_s
}quote! { #i }));
1194
1195 let mut function_decls = Vec::with_capacity(item_count);
1196 for decl in function_decls_input {
1197 match decl {
1198 Ok(mut decl) => {
1199 decl.attributes = merge_attributes(&parsed_block_attrs, decl.attributes);
1200 function_decls.push(decl)
1201 }
1202 Err(e) => {
1203 error = Some(
1204 error
1205 .take()
1206 .map(|mut o| {
1207 o.combine(e.clone());
1208 o
1209 })
1210 .unwrap_or(e),
1211 );
1212 }
1213 }
1214 }
1215
1216 error
1217 .map(Err)
1218 .unwrap_or(Ok(ExternSqlBlock { function_decls }))
1219 }
1220}
1221
1222fn merge_attributes(
1223 parsed_block_attrs: &[AttributeSpanWrapper<SqlFunctionAttribute>],
1224 mut attributes: Vec<AttributeSpanWrapper<SqlFunctionAttribute>>,
1225) -> Vec<AttributeSpanWrapper<SqlFunctionAttribute>> {
1226 for attr in parsed_block_attrs {
1227 if attributes.iter().all(|a| match (&a.item, &attr.item) {
1228 (SqlFunctionAttribute::Aggregate { .. }, SqlFunctionAttribute::Aggregate { .. }) => {
1229 ::core::panicking::panic("not yet implemented")todo!()
1230 }
1231 (SqlFunctionAttribute::Window { .. }, SqlFunctionAttribute::Window { .. })
1232 | (SqlFunctionAttribute::SqlName { .. }, SqlFunctionAttribute::SqlName { .. })
1233 | (
1234 SqlFunctionAttribute::Restriction { .. },
1235 SqlFunctionAttribute::Restriction { .. },
1236 )
1237 | (SqlFunctionAttribute::Variadic { .. }, SqlFunctionAttribute::Variadic { .. })
1238 | (
1239 SqlFunctionAttribute::SkipReturnTypeHelper { .. },
1240 SqlFunctionAttribute::SkipReturnTypeHelper { .. },
1241 ) => false,
1242 _ => true,
1243 }) {
1244 attributes.push(attr.clone());
1245 }
1246 }
1247 attributes
1248}
1249
1250#[derive(#[automatically_derived]
impl ::core::clone::Clone for SqlFunctionDecl {
#[inline]
fn clone(&self) -> SqlFunctionDecl {
SqlFunctionDecl {
attributes: ::core::clone::Clone::clone(&self.attributes),
fn_token: ::core::clone::Clone::clone(&self.fn_token),
fn_name: ::core::clone::Clone::clone(&self.fn_name),
generics: ::core::clone::Clone::clone(&self.generics),
args: ::core::clone::Clone::clone(&self.args),
return_type: ::core::clone::Clone::clone(&self.return_type),
}
}
}Clone)]
1251pub(crate) struct SqlFunctionDecl {
1252 attributes: Vec<AttributeSpanWrapper<SqlFunctionAttribute>>,
1253 fn_token: ::syn::token::FnToken![fn],
1254 fn_name: Ident,
1255 generics: Generics,
1256 args: Punctuated<StrictFnArg, ::syn::token::CommaToken![,]>,
1257 return_type: Type,
1258}
1259
1260impl Parse for SqlFunctionDecl {
1261 fn parse(input: ParseStream) -> Result<Self> {
1262 let mut error = None::<syn::Error>;
1263 let mut combine_error = |e: syn::Error| {
1264 error = Some(
1265 error
1266 .take()
1267 .map(|mut o| {
1268 o.combine(e.clone());
1269 o
1270 })
1271 .unwrap_or(e),
1272 )
1273 };
1274
1275 let attributes = Attribute::parse_outer(input).unwrap_or_else(|e| {
1276 combine_error(e);
1277 Vec::new()
1278 });
1279 let attributes_collected = parse_attributes(&mut combine_error, attributes);
1280
1281 let fn_token: ::syn::token::FnToken![fn] = input.parse().unwrap_or_else(|e| {
1282 combine_error(e);
1283 Default::default()
1284 });
1285 let fn_name = Ident::parse(input).unwrap_or_else(|e| {
1286 combine_error(e);
1287 Ident::new("dummy", Span::call_site())
1288 });
1289 let generics = Generics::parse(input).unwrap_or_else(|e| {
1290 combine_error(e);
1291 Generics {
1292 lt_token: None,
1293 params: Punctuated::new(),
1294 gt_token: None,
1295 where_clause: None,
1296 }
1297 });
1298 let args;
1299 let _paren = match ::syn::__private::parse_parens(&input) {
::syn::__private::Ok(parens) => {
args = parens.content;
_ = args;
parens.token
}
::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
}parenthesized!(args in input);
1300 let args = args
1301 .parse_terminated(StrictFnArg::parse, ::syn::token::CommaToken![,])
1302 .unwrap_or_else(|e| {
1303 combine_error(e);
1304 Punctuated::new()
1305 });
1306 let rarrow = Option::<::syn::token::RArrowToken![->]>::parse(input).unwrap_or_else(|e| {
1307 combine_error(e);
1308 None
1309 });
1310 let return_type = if rarrow.is_some() {
1311 Type::parse(input).unwrap_or_else(|e| {
1312 combine_error(e);
1313 Type::Never(syn::TypeNever {
1314 bang_token: Default::default(),
1315 })
1316 })
1317 } else {
1318 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expression");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expression_types");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "NotSelectable");
_s
})parse_quote!(diesel::expression::expression_types::NotSelectable)
1319 };
1320 let _semi = Option::<::syn::token::SemiToken![;]>::parse(input).unwrap_or_else(|e| {
1321 combine_error(e);
1322 None
1323 });
1324
1325 error.map(Err).unwrap_or(Ok(Self {
1326 attributes: attributes_collected,
1327 fn_token,
1328 fn_name,
1329 generics,
1330 args,
1331 return_type,
1332 }))
1333 }
1334}
1335
1336fn parse_attribute(attr: syn::Attribute) -> Result<AttributeSpanWrapper<SqlFunctionAttribute>> {
1337 match &attr.meta {
1338 syn::Meta::NameValue(syn::MetaNameValue {
1339 path,
1340 value:
1341 syn::Expr::Lit(syn::ExprLit {
1342 lit: syn::Lit::Str(sql_name),
1343 ..
1344 }),
1345 ..
1346 }) if path.is_ident("sql_name") => Ok(AttributeSpanWrapper {
1347 attribute_span: attr.span(),
1348 ident_span: sql_name.span(),
1349 item: SqlFunctionAttribute::SqlName {
1350 ident: path.require_ident()?.clone(),
1351 value: sql_name.clone(),
1352 },
1353 }),
1354 syn::Meta::Path(path) if path.is_ident("aggregate") => Ok(AttributeSpanWrapper {
1355 attribute_span: attr.span(),
1356 ident_span: path.span(),
1357 item: SqlFunctionAttribute::Aggregate {
1358 ident: path
1359 .require_ident()
1360 .map_err(|e| {
1361 syn::Error::new(
1362 e.span(),
1363 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, the correct format is `#[aggregate]`",
e))
})format!("{e}, the correct format is `#[aggregate]`"),
1364 )
1365 })?
1366 .clone(),
1367 },
1368 }),
1369 syn::Meta::Path(path) if path.is_ident("skip_return_type_helper") => {
1370 Ok(AttributeSpanWrapper {
1371 ident_span: attr.span(),
1372 attribute_span: path.span(),
1373 item: SqlFunctionAttribute::SkipReturnTypeHelper {
1374 ident: path
1375 .require_ident()
1376 .map_err(|e| {
1377 syn::Error::new(
1378 e.span(),
1379 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, the correct format is `#[skip_return_type_helper]`",
e))
})format!("{e}, the correct format is `#[skip_return_type_helper]`"),
1380 )
1381 })?
1382 .clone(),
1383 },
1384 })
1385 }
1386 syn::Meta::Path(path) if path.is_ident("window") => Ok(AttributeSpanWrapper {
1387 attribute_span: attr.span(),
1388 ident_span: path.span(),
1389 item: SqlFunctionAttribute::Window {
1390 ident: path
1391 .require_ident()
1392 .map_err(|e| {
1393 syn::Error::new(e.span(), ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, the correct format is `#[window]`",
e))
})format!("{e}, the correct format is `#[window]`"))
1394 })?
1395 .clone(),
1396 restrictions: BackendRestriction::None,
1397 require_order: None,
1398 wrap_macro: None,
1399 },
1400 }),
1401 syn::Meta::List(syn::MetaList {
1402 path,
1403 delimiter: syn::MacroDelimiter::Paren(_),
1404 tokens: _,
1405 }) if path.is_ident("variadic") => {
1406 let (count, flag) = attr
1407 .parse_args_with(|input: syn::parse::ParseStream| {
1408 if input.peek(LitInt){
1409 let count = input.parse::<LitInt>()?;
1410 if !input.is_empty(){
1411 return Err(syn::Error::new(input.span(), "unexpected token after positional `#[variadic(..)]`"));
1412 }
1413 Ok((count, LitBool::new(false, Span::call_site())))
1414 }
1415 else {
1416 let key: Ident = input.parse()?;
1417 if key != "last_arguments" {
1418 return Err(syn::Error::new(key.span(), "expect `last_arguments`"));
1419 }
1420 let _eq: ::syn::token::EqToken![=] = input.parse()?;
1421 let count: LitInt = input.parse()?;
1422 let skip_zero: LitBool = if input.peek(::syn::token::CommaToken![,]) {
1423 let _: ::syn::token::CommaToken![,] = input.parse()?;
1424 let key: Ident = input.parse()?;
1425 if key != "skip_zero_argument_variant" {
1426 return Err(
1427 syn::Error::new(
1428 key.span(), "expect `skip_zero_argument_variant`"
1429 )
1430 );
1431 }
1432 let _eq: ::syn::token::EqToken![=] = input.parse()?;
1433 input.parse()?
1434 } else {
1435 LitBool::new(false, Span::call_site())
1436 };
1437 Ok((count, skip_zero))
1438 }
1439 })
1440 .map_err(|e| {
1441 syn::Error::new(
1442 e.span(),
1443 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, the correct format is `#[variadic(last_arguments = 3)]` or `#[variadic(last_arguments = 3, skip_zero_argument_variant = true)]`",
e))
})format!(
1444 "{e}, the correct format is `#[variadic(last_arguments = 3)]` or `#[variadic(last_arguments = 3, skip_zero_argument_variant = true)]`"
1445 ),
1446 )
1447 })?;
1448 Ok(AttributeSpanWrapper {
1449 item: SqlFunctionAttribute::Variadic {
1450 ident: path
1451 .require_ident()
1452 .map_err(|e| {
1453 syn::Error::new(
1454 e.span(),
1455 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, the correct format is `#[variadic(3)]`",
e))
})format!("{e}, the correct format is `#[variadic(3)]`"),
1456 )
1457 })?
1458 .clone(),
1459 count: count.clone(),
1460 skip_zero_arg_variant: flag,
1461 },
1462 attribute_span: attr.span(),
1463 ident_span: path.require_ident()?.span(),
1464 })
1465 }
1466 syn::Meta::NameValue(_) | syn::Meta::Path(_) => Ok(AttributeSpanWrapper {
1467 attribute_span: attr.span(),
1468 ident_span: attr.span(),
1469 item: SqlFunctionAttribute::Other(attr),
1470 }),
1471 syn::Meta::List(_) => {
1472 let name = attr.meta.path().require_ident()?;
1473 let attribute_span = attr.meta.span();
1474 attr.clone()
1475 .parse_args_with(|input: &syn::parse::ParseBuffer| {
1476 SqlFunctionAttribute::parse_attr(
1477 name.clone(),
1478 input,
1479 attr.clone(),
1480 attribute_span,
1481 )
1482 })
1483 }
1484 }
1485}
1486
1487fn parse_attributes(
1488 combine_error: &mut impl FnMut(syn::Error),
1489 attributes: Vec<Attribute>,
1490) -> Vec<AttributeSpanWrapper<SqlFunctionAttribute>> {
1491 let attribute_count = attributes.len();
1492
1493 let attributes = attributes.into_iter().map(parse_attribute);
1494
1495 let mut attributes_collected = Vec::with_capacity(attribute_count);
1496 for attr in attributes {
1497 match attr {
1498 Ok(attr) => attributes_collected.push(attr),
1499 Err(e) => {
1500 combine_error(e);
1501 }
1502 }
1503 }
1504 attributes_collected
1505}
1506
1507#[derive(#[automatically_derived]
impl ::core::clone::Clone for StrictFnArg {
#[inline]
fn clone(&self) -> StrictFnArg {
StrictFnArg {
name: ::core::clone::Clone::clone(&self.name),
colon_token: ::core::clone::Clone::clone(&self.colon_token),
ty: ::core::clone::Clone::clone(&self.ty),
}
}
}Clone)]
1509struct StrictFnArg {
1510 name: Ident,
1511 colon_token: ::syn::token::ColonToken![:],
1512 ty: Type,
1513}
1514
1515impl Parse for StrictFnArg {
1516 fn parse(input: ParseStream) -> Result<Self> {
1517 let name = input.parse()?;
1518 let colon_token = input.parse()?;
1519 let ty = input.parse()?;
1520 Ok(Self {
1521 name,
1522 colon_token,
1523 ty,
1524 })
1525 }
1526}
1527
1528impl ToTokens for StrictFnArg {
1529 fn to_tokens(&self, tokens: &mut TokenStream) {
1530 self.name.to_tokens(tokens);
1531 self.colon_token.to_tokens(tokens);
1532 self.name.to_tokens(tokens);
1533 }
1534}
1535
1536fn is_sqlite_type(ty: &Type) -> Option<&Ident> {
1537 let last_segment = if let Type::Path(tp) = ty {
1538 tp.path.segments.last()?
1539 } else {
1540 return None;
1541 };
1542
1543 let ident = &last_segment.ident;
1544 if ident == "Nullable" {
1545 if let PathArguments::AngleBracketed(ref ab) = last_segment.arguments
1546 && let Some(GenericArgument::Type(ty)) = ab.args.first()
1547 {
1548 return is_sqlite_type(ty);
1549 }
1550 return None;
1551 }
1552
1553 Some(ident)
1554}
1555
1556#[derive(#[automatically_derived]
impl ::core::default::Default for BackendRestriction {
#[inline]
fn default() -> BackendRestriction { Self::None }
}Default, #[automatically_derived]
impl ::core::clone::Clone for BackendRestriction {
#[inline]
fn clone(&self) -> BackendRestriction {
match self {
BackendRestriction::None => BackendRestriction::None,
BackendRestriction::SqlDialect(__self_0, __self_1, __self_2) =>
BackendRestriction::SqlDialect(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2)),
BackendRestriction::BackendBound(__self_0, __self_1) =>
BackendRestriction::BackendBound(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
BackendRestriction::Backends(__self_0, __self_1) =>
BackendRestriction::Backends(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BackendRestriction {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
BackendRestriction::None =>
::core::fmt::Formatter::write_str(f, "None"),
BackendRestriction::SqlDialect(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"SqlDialect", __self_0, __self_1, &__self_2),
BackendRestriction::BackendBound(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"BackendBound", __self_0, &__self_1),
BackendRestriction::Backends(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Backends", __self_0, &__self_1),
}
}
}Debug)]
1557enum BackendRestriction {
1558 #[default]
1559 None,
1560 SqlDialect(syn::Ident, syn::Ident, syn::Path),
1561 BackendBound(
1562 syn::Ident,
1563 syn::punctuated::Punctuated<syn::TypeParamBound, ::syn::token::Plussyn::Token![+]>,
1564 ),
1565 Backends(
1566 syn::Ident,
1567 syn::punctuated::Punctuated<syn::Path, ::syn::token::Commasyn::Token![,]>,
1568 ),
1569}
1570
1571impl BackendRestriction {
1572 fn parse_from(input: &syn::parse::ParseBuffer<'_>) -> Result<Self> {
1573 if input.is_empty() {
1574 return Ok(Self::None);
1575 }
1576 Self::parse(input)
1577 }
1578
1579 fn parse_backends(
1580 input: &syn::parse::ParseBuffer<'_>,
1581 name: Ident,
1582 ) -> Result<BackendRestriction> {
1583 let backends = Punctuated::parse_terminated(input)?;
1584 Ok(Self::Backends(name, backends))
1585 }
1586
1587 fn parse_sql_dialect(
1588 content: &syn::parse::ParseBuffer<'_>,
1589 name: Ident,
1590 ) -> Result<BackendRestriction> {
1591 let dialect = content.parse()?;
1592 let _del: ::syn::token::Commasyn::Token![,] = content.parse()?;
1593 let dialect_variant = content.parse()?;
1594
1595 Ok(Self::SqlDialect(name, dialect, dialect_variant))
1596 }
1597
1598 fn parse_backend_bounds(
1599 input: &syn::parse::ParseBuffer<'_>,
1600 name: Ident,
1601 ) -> Result<BackendRestriction> {
1602 let restrictions = Punctuated::parse_terminated(input)?;
1603 Ok(Self::BackendBound(name, restrictions))
1604 }
1605
1606 fn generate_all_window_fragment_impls(
1607 &self,
1608 mut generics: Generics,
1609 ty_generics: &TypeGenerics<'_>,
1610 fn_name: &syn::Ident,
1611 require_order: bool,
1612 wrap_macro: Option<&Path>,
1613 ) -> TokenStream {
1614 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__P");
_s
})parse_quote!(__P));
1615 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__O");
_s
})parse_quote!(__O));
1616 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__F");
_s
})parse_quote!(__F));
1617 let order = if require_order {
1618 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Order");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__O");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "true");
::quote::__private::push_gt(&mut _s);
_s
}quote::quote! {
1619 diesel::internal::sql_functions::Order<__O, true>
1620 }
1621 } else {
1622 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__O");
_s
}quote::quote! {__O}
1623 };
1624 let out = match *self {
1625 BackendRestriction::None => {
1626 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal));
1627 let (impl_generics, _, _) = generics.split_for_impl();
1628 Self::generate_window_fragment_impl(
1629 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1630 Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_comma(&mut _s);
_s
})parse_quote!(__DieselInternal: diesel::backend::Backend,)),
1631 &impl_generics,
1632 ty_generics,
1633 fn_name,
1634 None,
1635 &order,
1636 )
1637 }
1638 BackendRestriction::SqlDialect(_, ref dialect, ref dialect_type) => {
1639 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal));
1640 let (impl_generics, _, _) = generics.split_for_impl();
1641 let mut out = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "WindowFunctionFragment");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_ident(&mut _s, "OverClause");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__P");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&order, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__F");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "WindowFunctionFragment");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqlDialect");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&dialect, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote::quote! {
1642 impl #impl_generics WindowFunctionFragment<#fn_name #ty_generics, __DieselInternal>
1643 for OverClause<__P, #order, __F>
1644 where
1645 Self: WindowFunctionFragment<#fn_name #ty_generics, __DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>,
1646 __DieselInternal: diesel::backend::Backend,
1647 {
1648 }
1649
1650 };
1651 let specific_impl = Self::generate_window_fragment_impl(
1652 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1653 Some(
1654 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqlDialect");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&dialect, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&dialect_type, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
_s
})parse_quote!(__DieselInternal: diesel::backend::Backend + diesel::backend::SqlDialect<#dialect = #dialect_type>,),
1655 ),
1656 &impl_generics,
1657 ty_generics,
1658 fn_name,
1659 Some(dialect_type),
1660 &order,
1661 );
1662 out.extend(specific_impl);
1663 out
1664 }
1665 BackendRestriction::BackendBound(_, ref restriction) => {
1666 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal));
1667 let (impl_generics, _, _) = generics.split_for_impl();
1668 Self::generate_window_fragment_impl(
1669 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1670 Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_add(&mut _s);
::quote::ToTokens::to_tokens(&restriction, &mut _s);
::quote::__private::push_comma(&mut _s);
_s
})parse_quote!(__DieselInternal: diesel::backend::Backend + #restriction,)),
1671 &impl_generics,
1672 ty_generics,
1673 fn_name,
1674 None,
1675 &order,
1676 )
1677 }
1678 BackendRestriction::Backends(_, ref backends) => {
1679 let (impl_generics, _, _) = generics.split_for_impl();
1680 let backends = backends.iter().map(|b| {
1681 Self::generate_window_fragment_impl(
1682 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&b, &mut _s);
_s
}quote! {#b},
1683 None,
1684 &impl_generics,
1685 ty_generics,
1686 fn_name,
1687 None,
1688 &order,
1689 )
1690 });
1691
1692 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut backends, i) = backends.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let backends =
match backends.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&backends, &mut _s);
}
}
_s
})parse_quote!(#(#backends)*)
1693 }
1694 };
1695 if let Some(wrap_macro) = wrap_macro {
1696 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&wrap_macro, &mut _s);
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&out, &mut _s);
_s
});
_s
}quote::quote! {
1697 #wrap_macro! {
1698 #out
1699 }
1700 }
1701 } else {
1702 out
1703 }
1704 }
1705
1706 fn generate_window_fragment_impl(
1707 backend: TokenStream,
1708 backend_bound: Option<proc_macro2::TokenStream>,
1709 impl_generics: &ImplGenerics<'_>,
1710 ty_generics: &TypeGenerics<'_>,
1711 fn_name: &syn::Ident,
1712 dialect: Option<&syn::Path>,
1713 order: &TokenStream,
1714 ) -> TokenStream {
1715 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "WindowFunctionFragment");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&backend, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&dialect, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_ident(&mut _s, "OverClause");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__P");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&order, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__F");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::ToTokens::to_tokens(&backend_bound, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote::quote! {
1716 impl #impl_generics WindowFunctionFragment<#fn_name #ty_generics, #backend, #dialect> for OverClause<__P, #order, __F>
1717 where #backend_bound
1718 {
1719
1720 }
1721 }
1722 }
1723
1724 fn generate_all_queryfragment_impls(
1725 &self,
1726 mut generics: Generics,
1727 ty_generics: &TypeGenerics<'_>,
1728 arg_name: &[&syn::Ident],
1729 fn_name: &syn::Ident,
1730 ) -> proc_macro2::TokenStream {
1731 match *self {
1732 BackendRestriction::None => {
1733 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal));
1734 let (impl_generics, _, _) = generics.split_for_impl();
1735 Self::generate_queryfragment_impl(
1736 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1737 Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_comma(&mut _s);
_s
})parse_quote!(__DieselInternal: diesel::backend::Backend,)),
1738 &impl_generics,
1739 ty_generics,
1740 arg_name,
1741 fn_name,
1742 None,
1743 )
1744 }
1745 BackendRestriction::BackendBound(_, ref restriction) => {
1746 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal));
1747 let (impl_generics, _, _) = generics.split_for_impl();
1748 Self::generate_queryfragment_impl(
1749 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1750 Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_add(&mut _s);
::quote::ToTokens::to_tokens(&restriction, &mut _s);
::quote::__private::push_comma(&mut _s);
_s
})parse_quote!(__DieselInternal: diesel::backend::Backend + #restriction,)),
1751 &impl_generics,
1752 ty_generics,
1753 arg_name,
1754 fn_name,
1755 None,
1756 )
1757 }
1758 BackendRestriction::SqlDialect(_, ref dialect, ref dialect_type) => {
1759 generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal));
1760 let (impl_generics, _, _) = generics.split_for_impl();
1761 let specific_impl = Self::generate_queryfragment_impl(
1762 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
_s
})parse_quote!(__DieselInternal),
1763 Some(
1764 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_add(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqlDialect");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&dialect, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&dialect_type, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
_s
})parse_quote!(__DieselInternal: diesel::backend::Backend + diesel::backend::SqlDialect<#dialect = #dialect_type>,),
1765 ),
1766 &impl_generics,
1767 ty_generics,
1768 arg_name,
1769 fn_name,
1770 Some(dialect_type),
1771 );
1772 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "QueryFragment");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryFragment");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqlDialect");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&dialect, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Backend");
::quote::__private::push_comma(&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, "walk_ast");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'__b");
::quote::__private::push_gt(&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_lifetime(&mut _s, "\'__b");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "AstPass");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'__b");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_gt(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::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_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "QueryFragment");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__DieselInternal");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "backend");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SqlDialect");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&dialect, &mut _s);
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "walk_ast");
::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_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "out");
_s
});
_s
});
_s
});
::quote::ToTokens::to_tokens(&specific_impl, &mut _s);
_s
}quote::quote! {
1773 impl #impl_generics QueryFragment<__DieselInternal>
1774 for #fn_name #ty_generics
1775 where
1776 Self: QueryFragment<__DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>,
1777 __DieselInternal: diesel::backend::Backend,
1778 {
1779 fn walk_ast<'__b>(&'__b self, mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
1780 <Self as QueryFragment<__DieselInternal, <__DieselInternal as diesel::backend::SqlDialect>::#dialect>>::walk_ast(self, out)
1781 }
1782
1783 }
1784
1785 #specific_impl
1786 }
1787 }
1788 BackendRestriction::Backends(_, ref backends) => {
1789 let (impl_generics, _, _) = generics.split_for_impl();
1790 let backends = backends.iter().map(|b| {
1791 Self::generate_queryfragment_impl(
1792 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&b, &mut _s);
_s
}quote! {#b},
1793 None,
1794 &impl_generics,
1795 ty_generics,
1796 arg_name,
1797 fn_name,
1798 None,
1799 )
1800 });
1801
1802 ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut backends, i) = backends.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let backends =
match backends.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&backends, &mut _s);
}
}
_s
})parse_quote!(#(#backends)*)
1803 }
1804 }
1805 }
1806
1807 fn generate_queryfragment_impl(
1808 backend: proc_macro2::TokenStream,
1809 backend_bound: Option<proc_macro2::TokenStream>,
1810 impl_generics: &ImplGenerics<'_>,
1811 ty_generics: &TypeGenerics<'_>,
1812 arg_name: &[&syn::Ident],
1813 fn_name: &syn::Ident,
1814 dialect: Option<&syn::Path>,
1815 ) -> proc_macro2::TokenStream {
1816 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "QueryFragment");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&backend, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&dialect, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&fn_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::ToTokens::to_tokens(&backend_bound, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut arg_name, i) = arg_name.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut backend, i) = backend.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arg_name =
match arg_name.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let backend =
match backend.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arg_name, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryFragment");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&backend, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&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, "walk_ast");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'__b");
::quote::__private::push_gt(&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_lifetime(&mut _s, "\'__b");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "AstPass");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'__b");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&backend, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "QueryResult");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::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, "out");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "push_sql");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "FunctionFragment");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&backend, &mut _s);
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FUNCTION_NAME");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "push_sql");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s, "\"(\"");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "walk_arguments");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "reborrow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_question(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "out");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "push_sql");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s, "\")\"");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
});
_s
}quote::quote! {
1817 impl #impl_generics QueryFragment<#backend, #dialect>
1818 for #fn_name #ty_generics
1819 where
1820 #backend_bound
1821 #(#arg_name: QueryFragment<#backend>,)*
1822 {
1823 fn walk_ast<'__b>(&'__b self, mut out: AstPass<'_, '__b, #backend>) -> QueryResult<()>{
1824 out.push_sql(<Self as FunctionFragment<#backend>>::FUNCTION_NAME);
1825 out.push_sql("(");
1826 self.walk_arguments(out.reborrow())?;
1827 out.push_sql(")");
1828 Ok(())
1829 }
1830 }
1831 }
1832 }
1833}
1834
1835impl Parse for BackendRestriction {
1836 fn parse(input: ParseStream) -> Result<Self> {
1837 let name: syn::Ident = input.parse()?;
1838 let name_str = name.to_string();
1839 let content;
1840 match ::syn::__private::parse_parens(&input) {
::syn::__private::Ok(parens) => {
content = parens.content;
_ = content;
parens.token
}
::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
};parenthesized!(content in input);
1841 match &*name_str {
1842 "backends" => Self::parse_backends(&content, name),
1843 "dialect" => Self::parse_sql_dialect(&content, name),
1844 "backend_bounds" => Self::parse_backend_bounds(&content, name),
1845 _ => Err(syn::Error::new(
1846 name.span(),
1847 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unexpected option `{0}`",
name_str))
})format!("unexpected option `{name_str}`"),
1848 )),
1849 }
1850 }
1851}
1852
1853#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SqlFunctionAttribute {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
SqlFunctionAttribute::Aggregate { ident: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Aggregate", "ident", &__self_0),
SqlFunctionAttribute::Window {
ident: __self_0,
restrictions: __self_1,
require_order: __self_2,
wrap_macro: __self_3 } =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"Window", "ident", __self_0, "restrictions", __self_1,
"require_order", __self_2, "wrap_macro", &__self_3),
SqlFunctionAttribute::SqlName { ident: __self_0, value: __self_1 }
=>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"SqlName", "ident", __self_0, "value", &__self_1),
SqlFunctionAttribute::Restriction { restriction: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Restriction", "restriction", &__self_0),
SqlFunctionAttribute::Variadic {
ident: __self_0,
count: __self_1,
skip_zero_arg_variant: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Variadic", "ident", __self_0, "count", __self_1,
"skip_zero_arg_variant", &__self_2),
SqlFunctionAttribute::SkipReturnTypeHelper { ident: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"SkipReturnTypeHelper", "ident", &__self_0),
SqlFunctionAttribute::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for SqlFunctionAttribute {
#[inline]
fn clone(&self) -> SqlFunctionAttribute {
match self {
SqlFunctionAttribute::Aggregate { ident: __self_0 } =>
SqlFunctionAttribute::Aggregate {
ident: ::core::clone::Clone::clone(__self_0),
},
SqlFunctionAttribute::Window {
ident: __self_0,
restrictions: __self_1,
require_order: __self_2,
wrap_macro: __self_3 } =>
SqlFunctionAttribute::Window {
ident: ::core::clone::Clone::clone(__self_0),
restrictions: ::core::clone::Clone::clone(__self_1),
require_order: ::core::clone::Clone::clone(__self_2),
wrap_macro: ::core::clone::Clone::clone(__self_3),
},
SqlFunctionAttribute::SqlName { ident: __self_0, value: __self_1 }
=>
SqlFunctionAttribute::SqlName {
ident: ::core::clone::Clone::clone(__self_0),
value: ::core::clone::Clone::clone(__self_1),
},
SqlFunctionAttribute::Restriction { restriction: __self_0 } =>
SqlFunctionAttribute::Restriction {
restriction: ::core::clone::Clone::clone(__self_0),
},
SqlFunctionAttribute::Variadic {
ident: __self_0,
count: __self_1,
skip_zero_arg_variant: __self_2 } =>
SqlFunctionAttribute::Variadic {
ident: ::core::clone::Clone::clone(__self_0),
count: ::core::clone::Clone::clone(__self_1),
skip_zero_arg_variant: ::core::clone::Clone::clone(__self_2),
},
SqlFunctionAttribute::SkipReturnTypeHelper { ident: __self_0 } =>
SqlFunctionAttribute::SkipReturnTypeHelper {
ident: ::core::clone::Clone::clone(__self_0),
},
SqlFunctionAttribute::Other(__self_0) =>
SqlFunctionAttribute::Other(::core::clone::Clone::clone(__self_0)),
}
}
}Clone)]
1854enum SqlFunctionAttribute {
1855 Aggregate {
1856 ident: Ident,
1857 },
1858 Window {
1859 ident: Ident,
1860 restrictions: BackendRestriction,
1861 require_order: Option<bool>,
1862 wrap_macro: Option<Path>,
1863 },
1864 SqlName {
1865 ident: Ident,
1866 value: LitStr,
1867 },
1868 Restriction {
1869 restriction: BackendRestriction,
1870 },
1871 Variadic {
1872 ident: Ident,
1873 count: LitInt,
1874 skip_zero_arg_variant: LitBool,
1875 },
1876 SkipReturnTypeHelper {
1877 ident: Ident,
1878 },
1879 Other(Attribute),
1880}
1881
1882impl MySpanned for SqlFunctionAttribute {
1883 fn span(&self) -> proc_macro2::Span {
1884 match self {
1885 SqlFunctionAttribute::Restriction {
1886 restriction: BackendRestriction::Backends(ident, ..),
1887 ..
1888 }
1889 | SqlFunctionAttribute::Restriction {
1890 restriction: BackendRestriction::SqlDialect(ident, ..),
1891 ..
1892 }
1893 | SqlFunctionAttribute::Restriction {
1894 restriction: BackendRestriction::BackendBound(ident, ..),
1895 ..
1896 }
1897 | SqlFunctionAttribute::Aggregate { ident, .. }
1898 | SqlFunctionAttribute::Window { ident, .. }
1899 | SqlFunctionAttribute::Variadic { ident, .. }
1900 | SqlFunctionAttribute::SkipReturnTypeHelper { ident, .. }
1901 | SqlFunctionAttribute::SqlName { ident, .. } => ident.span(),
1902 SqlFunctionAttribute::Restriction {
1903 restriction: BackendRestriction::None,
1904 ..
1905 } => {
1906 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("We do not construct that")));
}unreachable!("We do not construct that")
1907 }
1908 SqlFunctionAttribute::Other(attribute) => attribute.span(),
1909 }
1910 }
1911}
1912
1913fn parse_require_order(input: &syn::parse::ParseBuffer<'_>) -> Result<bool> {
1914 let ident = input.parse::<Ident>()?;
1915 if ident == "require_order" {
1916 let _ = input.parse::<::syn::token::EqToken![=]>()?;
1917 let value = input.parse::<LitBool>()?;
1918 Ok(value.value)
1919 } else {
1920 Err(syn::Error::new(
1921 ident.span(),
1922 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Expected `require_order` but got `{0}`",
ident))
})format!("Expected `require_order` but got `{ident}`"),
1923 ))
1924 }
1925}
1926
1927impl SqlFunctionAttribute {
1928 fn parse_attr(
1929 name: Ident,
1930 input: &syn::parse::ParseBuffer<'_>,
1931 attr: Attribute,
1932 attribute_span: proc_macro2::Span,
1933 ) -> Result<AttributeSpanWrapper<Self>> {
1934 if name == "cfg_attr" {
1937 let ident = input.parse::<Ident>()?;
1938 if ident != "feature" {
1939 return Err(syn::Error::new(
1940 ident.span(),
1941 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("only single feature `cfg_attr` attributes are supported. Got `{0}` but expected `feature = \"foo\"`",
ident))
})format!(
1942 "only single feature `cfg_attr` attributes are supported. \
1943 Got `{ident}` but expected `feature = \"foo\"`"
1944 ),
1945 ));
1946 }
1947 let _ = input.parse::<::syn::token::EqToken![=]>()?;
1948 let feature = input.parse::<LitStr>()?;
1949 let feature_value = feature.value();
1950 let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1951 let wrap_macro = match feature_value.as_str() {
1952 "postgres_backend" => Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_pg");
_s
})syn::parse_quote!(
1953 diesel::internal::sql_functions::expand_pg
1954 )),
1955 "sqlite" | "__sqlite_shared" => Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_sqlite");
_s
})syn::parse_quote!(
1956 diesel::internal::sql_functions::expand_sqlite
1957 )),
1958 "mysql_backend" => Some(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::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, "sql_functions");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "expand_mysql");
_s
})syn::parse_quote!(
1959 diesel::internal::sql_functions::expand_mysql
1960 )),
1961 feature => {
1962 return Err(syn::Error::new(
1963 feature.span(),
1964 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("only `mysql_backend`, `postgres_backend` and `sqlite` are supported features, but got `{0}`",
feature))
})format!(
1965 "only `mysql_backend`, `postgres_backend` and `sqlite` \
1966 are supported features, but got `{feature}`"
1967 ),
1968 ));
1969 }
1970 };
1971 let name = input.parse::<Ident>()?;
1972 let inner;
1973 let _paren = match ::syn::__private::parse_parens(&input) {
::syn::__private::Ok(parens) => {
inner = parens.content;
_ = inner;
parens.token
}
::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
}parenthesized!(inner in input);
1974 let mut ret = SqlFunctionAttribute::parse_attr(name, &inner, attr, attribute_span)?;
1975 if let SqlFunctionAttribute::Window { wrap_macro: w, .. } = &mut ret.item {
1976 *w = wrap_macro;
1977 }
1978 Ok(ret)
1979 } else {
1980 let name_str = name.to_string();
1981 let parsed_attr = match &*name_str {
1982 "window" => {
1983 let restrictions = if BackendRestriction::parse_from(&input.fork()).is_ok() {
1984 BackendRestriction::parse_from(input).map(Ok).ok()
1985 } else {
1986 None
1987 };
1988 if input.fork().parse::<::syn::token::CommaToken![,]>().is_ok() {
1989 let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1990 }
1991 let require_order = if parse_require_order(&input.fork()).is_ok() {
1992 Some(parse_require_order(input)?)
1993 } else {
1994 None
1995 };
1996 if input.fork().parse::<::syn::token::CommaToken![,]>().is_ok() {
1997 let _ = input.parse::<::syn::token::CommaToken![,]>()?;
1998 }
1999 let restrictions =
2000 restrictions.unwrap_or_else(|| BackendRestriction::parse_from(input))?;
2001 Self::Window {
2002 ident: name,
2003 restrictions,
2004 require_order,
2005 wrap_macro: None,
2006 }
2007 }
2008 "sql_name" => parse_eq(input, "sql_name = \"SUM\"").map(|v| Self::SqlName {
2009 ident: name,
2010 value: v,
2011 })?,
2012 "backends" => BackendRestriction::parse_backends(input, name)
2013 .map(|r| Self::Restriction { restriction: r })?,
2014 "dialect" => BackendRestriction::parse_sql_dialect(input, name)
2015 .map(|r| Self::Restriction { restriction: r })?,
2016 "backend_bounds" => BackendRestriction::parse_backend_bounds(input, name)
2017 .map(|r| Self::Restriction { restriction: r })?,
2018 "variadic" => {
2019 if input.peek(LitInt) {
2020 let count = input.parse::<LitInt>()?;
2021 if !input.is_empty() {
2022 return Err(syn::Error::new(
2023 input.span(),
2024 "unexpected token after positional `#[variadic(..)]`",
2025 ));
2026 }
2027 Self::Variadic {
2028 ident: name,
2029 count,
2030 skip_zero_arg_variant: LitBool::new(false, Span::call_site()),
2031 }
2032 } else {
2033 let key: Ident = input.parse()?;
2034 if key != "last_arguments" {
2035 return Err(syn::Error::new(key.span(), "expect `last_arguments`"));
2036 }
2037 let _eq: ::syn::token::EqToken![=] = input.parse()?;
2038 let count: LitInt = input.parse()?;
2039 let skip_zero: LitBool = if input.peek(::syn::token::CommaToken![,]) {
2040 let _: ::syn::token::CommaToken![,] = input.parse()?;
2041 let key: Ident = input.parse()?;
2042 if key != "skip_zero_argument_variant" {
2043 return Err(syn::Error::new(
2044 key.span(),
2045 "expect `skip_zero_argument_variant`",
2046 ));
2047 }
2048 let _eq: ::syn::token::EqToken![=] = input.parse()?;
2049 input.parse()?
2050 } else {
2051 LitBool::new(false, Span::call_site())
2052 };
2053 Self::Variadic {
2054 ident: name,
2055 count,
2056 skip_zero_arg_variant: skip_zero,
2057 }
2058 }
2059 }
2060 _ => {
2061 let _ = input.step(|cursor| {
2063 let mut rest = *cursor;
2064 while let Some((_, next)) = rest.token_tree() {
2065 rest = next;
2066 }
2067 Ok(((), rest))
2068 });
2069 SqlFunctionAttribute::Other(attr)
2070 }
2071 };
2072 Ok(AttributeSpanWrapper {
2073 ident_span: parsed_attr.span(),
2074 item: parsed_attr,
2075 attribute_span,
2076 })
2077 }
2078 }
2079}
2080
2081#[derive(#[automatically_derived]
impl ::core::default::Default for DeclareSqlFunctionArgs {
#[inline]
fn default() -> DeclareSqlFunctionArgs {
DeclareSqlFunctionArgs {
generate_return_type_helpers: ::core::default::Default::default(),
}
}
}Default)]
2082pub(crate) struct DeclareSqlFunctionArgs {
2083 pub(crate) generate_return_type_helpers: bool,
2084}
2085
2086impl DeclareSqlFunctionArgs {
2087 pub(crate) fn parse_from_macro_input(input: TokenStream) -> syn::Result<Self> {
2088 if input.is_empty() {
2089 return Ok(Self::default());
2090 }
2091 let input_span = input.span();
2092 let parsed: syn::MetaNameValue = syn::parse2(input).map_err(|e| {
2093 let span = e.span();
2094 syn::Error::new(
2095 span,
2096 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, the correct format is `generate_return_type_helpers = true/false`",
e))
})format!("{e}, the correct format is `generate_return_type_helpers = true/false`"),
2097 )
2098 })?;
2099 match parsed {
2100 syn::MetaNameValue {
2101 path,
2102 value:
2103 syn::Expr::Lit(syn::ExprLit {
2104 lit: syn::Lit::Bool(b),
2105 ..
2106 }),
2107 ..
2108 } if path.is_ident("generate_return_type_helpers") => Ok(Self {
2109 generate_return_type_helpers: b.value,
2110 }),
2111 _ => Err(syn::Error::new(input_span, "Invalid config")),
2112 }
2113 }
2114}