1use crate::attrs::AttributeSpanWrapper;
2use crate::field::Field;
3use crate::model::Model;
4use crate::util::{inner_of_option_ty, is_option_ty, wrap_in_dummy_mod};
5use proc_macro2::{Span, TokenStream};
6use quote::quote;
7use quote::quote_spanned;
8use syn::parse_quote;
9use syn::spanned::Spanned as _;
10use syn::{DeriveInput, Expr, Path, Result, Type};
11
12pub fn derive(item: DeriveInput) -> Result<TokenStream> {
13 let model = Model::from_item(&item, false, true)?;
14
15 let tokens = model
16 .table_names()
17 .iter()
18 .map(|table_name| derive_into_single_table(&item, &model, table_name))
19 .collect::<Result<Vec<_>>>()?;
20
21 Ok(wrap_in_dummy_mod({
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut tokens, i) = tokens.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let tokens =
match tokens.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&tokens, &mut _s);
}
}
_s
}quote! {
22 #(#tokens)*
23 }))
24}
25
26fn derive_into_single_table(
27 item: &DeriveInput,
28 model: &Model,
29 table_name: &Path,
30) -> Result<TokenStream> {
31 let treat_none_as_default_value = model.treat_none_as_default_value();
32 let struct_name = &item.ident;
33
34 let (impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();
35
36 let mut generate_borrowed_insert = true;
37
38 let mut direct_field_ty = Vec::with_capacity(model.fields().len());
39 let mut direct_field_assign = Vec::with_capacity(model.fields().len());
40 let mut ref_field_ty = Vec::with_capacity(model.fields().len());
41 let mut ref_field_assign = Vec::with_capacity(model.fields().len());
42
43 let mut field_ty_bounds = Vec::with_capacity(model.fields().len());
45 let mut borrowed_field_ty_bounds = Vec::with_capacity(model.fields().len());
46
47 for field in model.fields() {
48 if field.skip_insertion() {
50 continue;
51 }
52 let treat_none_as_default_value = match &field.treat_none_as_default_value {
54 Some(attr) => {
55 if let Some(embed) = &field.embed {
56 return Err(syn::Error::new(
57 embed.attribute_span,
58 "`embed` and `treat_none_as_default_value` are mutually exclusive",
59 ));
60 }
61
62 if !is_option_ty(&field.ty) {
63 return Err(syn::Error::new(
64 field.ty.span(),
65 "expected `treat_none_as_default_value` field to be of type `Option<_>`",
66 ));
67 }
68
69 attr.item
70 }
71 None => treat_none_as_default_value,
72 };
73
74 match (field.serialize_as.as_ref(), field.embed()) {
75 (None, true) => {
76 direct_field_ty.push(field_ty_embed(field, None));
77 direct_field_assign.push(field_expr_embed(field, None));
78 ref_field_ty.push(field_ty_embed(field, Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'insert");
_s
}quote!(&'insert))));
79 ref_field_assign.push(field_expr_embed(field, Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
_s
}quote!(&))));
80 }
81 (None, false) => {
82 direct_field_ty.push(field_ty(
83 field,
84 table_name,
85 None,
86 treat_none_as_default_value,
87 )?);
88 direct_field_assign.push(field_expr(
89 field,
90 table_name,
91 None,
92 treat_none_as_default_value,
93 )?);
94 ref_field_ty.push(field_ty(
95 field,
96 table_name,
97 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'insert");
_s
}quote!(&'insert)),
98 treat_none_as_default_value,
99 )?);
100 ref_field_assign.push(field_expr(
101 field,
102 table_name,
103 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
_s
}quote!(&)),
104 treat_none_as_default_value,
105 )?);
106
107 field_ty_bounds.push(generate_field_bound(
108 field,
109 table_name,
110 &field.ty,
111 treat_none_as_default_value,
112 false,
113 )?);
114
115 borrowed_field_ty_bounds.push(generate_field_bound(
116 field,
117 table_name,
118 &field.ty,
119 treat_none_as_default_value,
120 true,
121 )?);
122 }
123 (Some(AttributeSpanWrapper { item: ty, .. }), false) => {
124 direct_field_ty.push(field_ty_serialize_as(
125 field,
126 table_name,
127 ty,
128 treat_none_as_default_value,
129 )?);
130 direct_field_assign.push(field_expr_serialize_as(
131 field,
132 table_name,
133 ty,
134 treat_none_as_default_value,
135 )?);
136
137 field_ty_bounds.push(generate_field_bound(
138 field,
139 table_name,
140 ty,
141 treat_none_as_default_value,
142 false,
143 )?);
144
145 generate_borrowed_insert = false; }
147 (Some(AttributeSpanWrapper { attribute_span, .. }), true) => {
148 return Err(syn::Error::new(
149 *attribute_span,
150 "`#[diesel(embed)]` cannot be combined with `#[diesel(serialize_as)]`",
151 ));
152 }
153 }
154 }
155
156 let insert_owned = {
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, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&struct_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut field_ty_bounds, i) = field_ty_bounds.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let field_ty_bounds =
match field_ty_bounds.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&field_ty_bounds, &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, "Values");
::quote::__private::push_eq(&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 direct_field_ty, i) =
direct_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let direct_field_ty =
match direct_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&direct_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_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, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&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 direct_field_ty, i) =
direct_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let direct_field_ty =
match direct_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&direct_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_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, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
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, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "values");
::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,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut direct_field_assign, i) =
direct_field_assign.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let direct_field_assign =
match direct_field_assign.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&direct_field_assign, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
});
_s
});
_s
});
_s
}quote! {
157 impl #impl_generics diesel::insertable::Insertable<#table_name::table> for #struct_name #ty_generics
158 where
159 #where_clause
160 #(#field_ty_bounds,)*
161 {
162 type Values = <(#(#direct_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values;
163
164 fn values(self) -> <(#(#direct_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values {
165 diesel::insertable::Insertable::<#table_name::table>::values((#(#direct_field_assign,)*))
166 }
167 }
168 };
169
170 let insert_borrowed = if generate_borrowed_insert {
171 let mut impl_generics = item.generics.clone();
172 impl_generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_lifetime(&mut _s, "\'insert");
_s
})parse_quote!('insert));
173 let (impl_generics, ..) = impl_generics.split_for_impl();
174
175 {
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, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'insert");
::quote::ToTokens::to_tokens(&struct_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut borrowed_field_ty_bounds, i) =
borrowed_field_ty_bounds.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let borrowed_field_ty_bounds =
match borrowed_field_ty_bounds.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&borrowed_field_ty_bounds, &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, "Values");
::quote::__private::push_eq(&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 ref_field_ty, i) = ref_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let ref_field_ty =
match ref_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&ref_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_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, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&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 ref_field_ty, i) = ref_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let ref_field_ty =
match ref_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&ref_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_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, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
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, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "values");
::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,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut ref_field_assign, i) =
ref_field_assign.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let ref_field_assign =
match ref_field_assign.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&ref_field_assign, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
});
_s
});
_s
});
_s
}quote! {
176 impl #impl_generics diesel::insertable::Insertable<#table_name::table>
177 for &'insert #struct_name #ty_generics
178 where
179 #where_clause
180 #(#borrowed_field_ty_bounds,)*
181 {
182 type Values = <(#(#ref_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values;
183
184 fn values(self) -> <(#(#ref_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values {
185 diesel::insertable::Insertable::<#table_name::table>::values((#(#ref_field_assign,)*))
186 }
187 }
188 }
189 } else {
190 ::quote::__private::TokenStream::new();quote! {}
191 };
192
193 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&insert_owned, &mut _s);
::quote::ToTokens::to_tokens(&insert_borrowed, &mut _s);
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &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, "derives");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UndecoratedInsertRecord");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&struct_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote! {
194 #insert_owned
195
196 #insert_borrowed
197
198 impl #impl_generics diesel::internal::derives::insertable::UndecoratedInsertRecord<#table_name::table>
199 for #struct_name #ty_generics
200 #where_clause
201 {
202 }
203 })
204}
205
206fn field_ty_embed(field: &Field, lifetime: Option<TokenStream>) -> TokenStream {
207 let field_ty = &field.ty;
208 let span = Span::mixed_site().located_at(field.span);
209 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::ToTokens::to_tokens(&field_ty, &mut _s);
_s
}quote_spanned!(span=> #lifetime #field_ty)
210}
211
212fn field_expr_embed(field: &Field, lifetime: Option<TokenStream>) -> TokenStream {
213 let field_name = &field.name;
214 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
}quote!(#lifetime self.#field_name)
215}
216
217fn field_ty_serialize_as(
218 field: &Field,
219 table_name: &Path,
220 ty: &Type,
221 treat_none_as_default_value: bool,
222) -> Result<TokenStream> {
223 let column_name = field.column_name()?.to_ident()?;
224 let span = Span::mixed_site().located_at(field.span);
225 if treat_none_as_default_value {
226 let inner_ty = inner_of_option_ty(ty);
227
228 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "std");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&inner_ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_shr_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
229 std::option::Option<diesel::dsl::Eq<
230 #table_name::#column_name,
231 #inner_ty,
232 >>
233 })
234 } else {
235 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_gt_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
236 diesel::dsl::Eq<
237 #table_name::#column_name,
238 #ty,
239 >
240 })
241 }
242}
243
244fn field_expr_serialize_as(
245 field: &Field,
246 table_name: &Path,
247 ty: &Type,
248 treat_none_as_default_value: bool,
249) -> Result<TokenStream> {
250 let field_name = &field.name;
251 let column_name = field.column_name()?.to_ident()?;
252 let column = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
_s
}quote!(#table_name::#column_name);
253 if treat_none_as_default_value {
254 if is_option_ty(ty) {
255 Ok(
256 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Into");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
_s
});
_s
});
_s
}quote!(::std::convert::Into::<#ty>::into(self.#field_name).map(|v| diesel::ExpressionMethods::eq(#column, v))),
257 )
258 } else {
259 Ok(
260 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Into");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
});
_s
});
_s
}quote!(std::option::Option::Some(diesel::ExpressionMethods::eq(#column, ::std::convert::Into::<#ty>::into(self.#field_name)))),
261 )
262 }
263 } else {
264 Ok(
265 {
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, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Into");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
});
_s
}quote!(diesel::ExpressionMethods::eq(#column, ::std::convert::Into::<#ty>::into(self.#field_name))),
266 )
267 }
268}
269
270fn field_ty(
271 field: &Field,
272 table_name: &Path,
273 lifetime: Option<TokenStream>,
274 treat_none_as_default_value: bool,
275) -> Result<TokenStream> {
276 let column_name = field.column_name()?.to_ident()?;
277 let span = Span::mixed_site().located_at(field.span);
278 if treat_none_as_default_value {
279 let inner_ty = inner_of_option_ty(&field.ty);
280
281 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "std");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::ToTokens::to_tokens(&inner_ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_shr_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
282 std::option::Option<diesel::dsl::Eq<
283 #table_name::#column_name,
284 #lifetime #inner_ty,
285 >>
286 })
287 } else {
288 let inner_ty = &field.ty;
289
290 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::ToTokens::to_tokens(&inner_ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_gt_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
291 diesel::dsl::Eq<
292 #table_name::#column_name,
293 #lifetime #inner_ty,
294 >
295 })
296 }
297}
298
299fn field_expr(
300 field: &Field,
301 table_name: &Path,
302 lifetime: Option<TokenStream>,
303 treat_none_as_default_value: bool,
304) -> Result<TokenStream> {
305 let field_name = &field.name;
306 let column_name = field.column_name()?.to_ident()?;
307
308 let column: Expr = ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
_s
})parse_quote!(#table_name::#column_name);
309 if treat_none_as_default_value {
310 if is_option_ty(&field.ty) {
311 if lifetime.is_some() {
312 Ok(
313 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "as_ref");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
_s
});
_s
});
_s
}quote!(self.#field_name.as_ref().map(|x| diesel::ExpressionMethods::eq(#column, x))),
314 )
315 } else {
316 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
_s
});
_s
});
_s
}quote!(self.#field_name.map(|x| diesel::ExpressionMethods::eq(#column, x))))
317 }
318 } else {
319 Ok(
320 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
});
_s
}quote!(std::option::Option::Some(diesel::ExpressionMethods::eq(#column, #lifetime self.#field_name))),
321 )
322 }
323 } else {
324 Ok({
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, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
}quote!(diesel::ExpressionMethods::eq(#column, #lifetime self.#field_name)))
325 }
326}
327
328fn generate_field_bound(
330 field: &Field,
331 table_name: &Path,
332 ty: &Type,
333 treat_none_as_default_value: bool,
334 borrowed: bool,
335) -> Result<TokenStream> {
336 let column_name = field.column_name()?.to_ident()?;
337 let span = Span::mixed_site().located_at(field.span);
338 let ty_to_check = if treat_none_as_default_value {
339 inner_of_option_ty(ty)
340 } else {
341 ty
342 };
343
344 let bound_ty = if borrowed {
345 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_and_spanned(&mut _s, _span);
::quote::__private::push_lifetime_spanned(&mut _s, _span, "\'insert");
::quote::ToTokens::to_tokens(&ty_to_check, &mut _s);
_s
}quote_spanned! {span=> &'insert #ty_to_check}
346 } else {
347 {
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::ToTokens::to_tokens(&ty_to_check, &mut _s);
_s
}quote_spanned! {span=> #ty_to_check}
348 };
349
350 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::ToTokens::to_tokens(&bound_ty, &mut _s);
::quote::__private::push_colon_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "expression");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "AsExpression");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "as");
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Expression");
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "SqlType");
::quote::__private::push_gt_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
351 #bound_ty: diesel::expression::AsExpression<
352 <#table_name::#column_name as diesel::Expression>::SqlType
353 >
354 })
355}