1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use proc_macro2;
use syn;
use model::*;
use util::*;
pub fn derive(item: syn::DeriveInput) -> Result<proc_macro2::TokenStream, Diagnostic> {
let model = Model::from_item(&item)?;
let struct_name = &model.name;
let table_name = model.table_name();
let (impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();
let mut ref_generics = item.generics.clone();
ref_generics.params.push(parse_quote!('ident));
let (ref_generics, ..) = ref_generics.split_for_impl();
let (field_ty, field_access): (Vec<_>, Vec<_>) = model
.primary_key_names
.iter()
.filter_map(|pk| model.find_column(pk).emit_error())
.map(|f| (&f.ty, f.name.access()))
.unzip();
Ok(wrap_in_dummy_mod(
model.dummy_mod_name("identifiable"),
quote! {
use diesel::associations::{HasTable, Identifiable};
impl #impl_generics HasTable for #struct_name #ty_generics
#where_clause
{
type Table = #table_name::table;
fn table() -> Self::Table {
#table_name::table
}
}
impl #ref_generics Identifiable for &'ident #struct_name #ty_generics
#where_clause
{
type Id = (#(&'ident #field_ty),*);
fn id(self) -> Self::Id {
(#(&self#field_access),*)
}
}
},
))
}