-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rewrite
#[derive(Queryable)]
in derives2
This was fairly recently rewritten, so it should in theory be the most straightforward derive to port. Unfortunately, due to rust-lang/rust#47311, it's obnoxiously hard to actually construct a struct in a derive right now. We have to do hacky workarounds until that is fixed.
- Loading branch information
Showing
8 changed files
with
79 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
use proc_macro2::Span; | ||
use quote; | ||
use syn; | ||
|
||
use model::*; | ||
use util::*; | ||
|
||
pub fn derive(item: syn::DeriveInput) -> Result<quote::Tokens, Diagnostic> { | ||
let model = Model::from_item(&item)?; | ||
|
||
let struct_name = item.ident; | ||
let field_ty = model.fields().iter().map(|f| &f.ty).collect::<Vec<_>>(); | ||
let field_ty = &field_ty; | ||
let build_expr = model.fields().iter().enumerate().map(|(i, f)| { | ||
let field_name = &f.name.for_assignment(); | ||
let i: syn::Index = i.into(); | ||
// Make sure `row` has a `def_site` span | ||
let row = quote!(row); | ||
// https://github.com/rust-lang/rust/issues/47311 | ||
let span = Span::call_site(); | ||
quote_spanned!(span=> #field_name: (#row.#i)) | ||
}); | ||
|
||
let (_, ty_generics, _) = item.generics.split_for_impl(); | ||
let mut generics = item.generics.clone(); | ||
generics | ||
.params | ||
.push(parse_quote!(__DB: diesel::backend::Backend)); | ||
generics.params.push(parse_quote!(__ST)); | ||
{ | ||
let where_clause = generics.where_clause.get_or_insert(parse_quote!(where)); | ||
where_clause | ||
.predicates | ||
.push(parse_quote!((#(#field_ty,)*): Queryable<__ST, __DB>)); | ||
} | ||
let (impl_generics, _, where_clause) = generics.split_for_impl(); | ||
|
||
Ok(wrap_in_dummy_mod( | ||
model.dummy_mod_name("queryable"), | ||
quote! { | ||
use self::diesel::Queryable; | ||
|
||
impl #impl_generics Queryable<__ST, __DB> for #struct_name #ty_generics | ||
#where_clause | ||
{ | ||
type Row = <(#(#field_ty,)*) as Queryable<__ST, __DB>>::Row; | ||
|
||
fn build(row: Self::Row) -> Self { | ||
let row: (#(#field_ty,)*) = Queryable::build(row); | ||
Self { | ||
#(#build_expr,)* | ||
} | ||
} | ||
} | ||
}, | ||
)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,3 +12,4 @@ mod schema; | |
|
||
mod as_changeset; | ||
mod identifiable; | ||
mod queryable; |