Skip to content

Commit

Permalink
Fix all the new warnings generated by wundergraph_derive
Browse files Browse the repository at this point in the history
  • Loading branch information
weiznich committed Sep 21, 2018
1 parent 2f662b1 commit 0fb463e
Show file tree
Hide file tree
Showing 9 changed files with 154 additions and 166 deletions.
17 changes: 9 additions & 8 deletions wundergraph_derive/src/build_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,16 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
None
};

let dummy_mod = model.dummy_mod_name("build_filter");
Ok(wrap_in_dummy_mod(
&dummy_mod,
"build_filter",
&model.name,
&quote! {
use self::wundergraph::filter::build_filter::BuildFilter;
use self::wundergraph::filter::collector::AndCollector;
use self::wundergraph::diesel_ext::BoxableFilter;
use self::wundergraph::diesel::sql_types::Bool;
use self::wundergraph::filter::transformator::Transformator;
use wundergraph::filter::build_filter::BuildFilter;
use wundergraph::filter::collector::AndCollector;
use wundergraph::diesel_ext::BoxableFilter;
use wundergraph::diesel::sql_types::Bool;
use wundergraph::filter::transformator::Transformator;
use wundergraph::diesel;

#pg
#sqlite
Expand Down Expand Up @@ -87,6 +88,6 @@ fn impl_build_filter(
fn build_field_filter(field: &Field) -> Result<TokenStream, Diagnostic> {
let field_access = field.rust_name().access();
Ok(
quote!(<_ as self::wundergraph::filter::collector::FilterCollector<_, _>>::append_filter(&mut and, self #field_access, t);),
quote!(<_ as wundergraph::filter::collector::FilterCollector<_, _>>::append_filter(&mut and, self #field_access, t);),
)
}
147 changes: 76 additions & 71 deletions wundergraph_derive/src/filter.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
use diagnostic_shim::Diagnostic;
use field::Field;
use model::Model;
use proc_macro2::{Span, TokenStream};
use proc_macro2::{Ident, Span, TokenStream};
use syn;
use utils::{
inner_of_option_ty, inner_ty_arg, is_has_many, is_has_one, is_option_ty,
wrap_in_dummy_mod_with_reeport,
};
use utils::{inner_of_option_ty, inner_ty_arg, is_has_many, is_has_one, is_option_ty};

pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
let item_name = &item.ident;
Expand All @@ -14,7 +12,6 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
let table_ty = model.table_type()?;
let table = table_ty.to_string();

let dummy_mod = model.dummy_mod_name("wundergraph_filter");
let fields = model
.fields()
.iter()
Expand All @@ -25,85 +22,93 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
if f.has_flag("skip") {
None
} else if is_has_one(field_ty) {
let reference_ty =
if is_option_ty(inner_ty_arg(field_ty, "HasOne", 1).expect("It's there")) {
quote!(self::wundergraph::filter::NullableReferenceFilter)
} else {
quote!(self::wundergraph::filter::ReferenceFilter)
};
let remote_table = f.remote_table().map(|t| quote!(#t::table)).unwrap_or_else(
|_| {
let remote_type = inner_of_option_ty(
inner_ty_arg(&f.ty, "HasOne", 1).expect("It's HasOne"),
);
quote!{
<#remote_type as diesel::associations::HasTable>::Table
}
},
);
let remote_filter = f.filter().expect("Filter is missing");
handle_has_one(f, &table_ty)
} else if is_has_many(field_ty) {
handle_has_many(f, item_name, &table_ty)
} else {
let graphql_name = f.graphql_name().to_string();
Some(Ok(quote!{
#[wundergraph(graphql_name = #graphql_name)]
#field_name: Option<#reference_ty<
#table_ty::#sql_name,
#remote_filter,
<#remote_table as diesel::Table>::PrimaryKey,
#field_name: ::std::option::Option<::wundergraph::filter::FilterOption<
#field_ty,
#table_ty::#sql_name,
>>
}))
} else if is_has_many(field_ty) {
let reference_ty = if f.is_nullable_reference() {
quote!(self::wundergraph::filter::ReverseNullableReferenceFilter)
} else {
quote!(self::wundergraph::filter::ReferenceFilter)
};
let remote_table = f.remote_table().map(|t| quote!(#t)).unwrap_or_else(|_| {
}
}).collect::<Result<Vec<_>, _>>()?;

Ok(quote! {
#[derive(Nameable, Debug, Clone, BuildFilter, InnerFilter)]
#[wundergraph(table_name = #table)]
pub struct #filter_name {
#(#fields,)*
}
})
}

fn handle_has_many(
f: &Field,
item_name: &Ident,
table_ty: &Ident,
) -> Option<Result<TokenStream, Diagnostic>> {
let field_name = f.rust_name();
let reference_ty = if f.is_nullable_reference() {
quote!(::wundergraph::filter::ReverseNullableReferenceFilter)
} else {
quote!(::wundergraph::filter::ReferenceFilter)
};
let remote_table = f.remote_table().map(|t| quote!(#t)).unwrap_or_else(|_| {
let remote_type = inner_ty_arg(inner_of_option_ty(&f.ty), "HasMany", 0)
.expect("It is HasMany");
quote!(<<#remote_type as diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn as diesel::Column>::Table)
quote!(<<#remote_type as ::wundergraph::diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn as ::wundergraph::diesel::Column>::Table)
});
let foreign_key = f
let foreign_key = f
.foreign_key()
.map(|k| quote!(#remote_table::#k))
.unwrap_or_else(|_| {
let remote_type = inner_ty_arg(inner_of_option_ty(&f.ty), "HasMany", 0)
.expect("It is HasMany");
quote!(<#remote_type as diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn)
quote!(<#remote_type as ::wundergraph::diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn)
});
let remote_filter = f.filter().expect("Filter is missing");
let graphql_name = f.graphql_name().to_string();
Some(Ok(quote!{
#[wundergraph(graphql_name = #graphql_name)]
#field_name: Option<#reference_ty<
<#table_ty::table as diesel::Table>::PrimaryKey,
#remote_filter,
#foreign_key,
>>
}))
} else {
let graphql_name = f.graphql_name().to_string();
Some(Ok(quote!{
#[wundergraph(graphql_name = #graphql_name)]
#field_name: Option<self::wundergraph::filter::FilterOption<
#field_ty,
#table_ty::#sql_name,
>>
}))
}
})
.collect::<Result<Vec<_>, _>>()?;

Ok(wrap_in_dummy_mod_with_reeport(
&dummy_mod,
&quote! {
use self::wundergraph::diesel;
let remote_filter = f.filter().expect("Filter is missing");
let graphql_name = f.graphql_name().to_string();
Some(Ok(quote!{
#[wundergraph(graphql_name = #graphql_name)]
#field_name: ::std::option::Option<#reference_ty<
<#table_ty::table as ::wundergraph::diesel::Table>::PrimaryKey,
#remote_filter,
#foreign_key,
>>
}))
}

#[derive(Nameable, BuildFilter, InnerFilter, Debug, Clone)]
#[wundergraph(table_name = #table)]
pub struct #filter_name {
#(#fields,)*
fn handle_has_one(f: &Field, table_ty: &Ident) -> Option<Result<TokenStream, Diagnostic>> {
let field_name = f.rust_name();
let field_ty = &f.ty;
let sql_name = f.sql_name();
let reference_ty = if is_option_ty(inner_ty_arg(field_ty, "HasOne", 1).expect("It's there")) {
quote!(::wundergraph::filter::NullableReferenceFilter)
} else {
quote!(::wundergraph::filter::ReferenceFilter)
};
let remote_table = f
.remote_table()
.map(|t| quote!(#t::table))
.unwrap_or_else(|_| {
let remote_type =
inner_of_option_ty(inner_ty_arg(&f.ty, "HasOne", 1).expect("It's HasOne"));
quote!{
<#remote_type as ::wundergraph::diesel::associations::HasTable>::Table
}
},
&[quote!(#filter_name)],
))
});
let remote_filter = f.filter().expect("Filter is missing");
let graphql_name = f.graphql_name().to_string();
Some(Ok(quote!{
#[wundergraph(graphql_name = #graphql_name)]
#field_name: ::std::option::Option<#reference_ty<
#table_ty::#sql_name,
#remote_filter,
<#remote_table as ::wundergraph::diesel::Table>::PrimaryKey,
>>
}))
}
11 changes: 4 additions & 7 deletions wundergraph_derive/src/filter_value.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use diagnostic_shim::Diagnostic;
use proc_macro2::{Span, TokenStream};
use proc_macro2::TokenStream;
use syn;
use utils::wrap_in_dummy_mod;

Expand All @@ -10,14 +10,11 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
generics.params.push(parse_quote!(__C));
let (impl_generics, _, _) = generics.split_for_impl();

let dummy_mod = format!(
"_impl_filter_value_for_{}",
item.ident.to_string().to_lowercase()
);
Ok(wrap_in_dummy_mod(
&syn::Ident::new(&dummy_mod, Span::call_site()),
"filter_value_for",
&item.ident,
&quote! {
use self::wundergraph::filter::filter_value::FilterValue;
use wundergraph::filter::filter_value::FilterValue;

impl #impl_generics FilterValue<__C> for #item_name #ty_generics
#where_clause
Expand Down
12 changes: 5 additions & 7 deletions wundergraph_derive/src/from_lookahead.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,13 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {

let (impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();

let dummy_mod = format!(
"_impl_from_lookahead_for_{}",
item.ident.to_string().to_lowercase()
);

Ok(wrap_in_dummy_mod(
&syn::Ident::new(&dummy_mod, Span::call_site()),
"from_look_ahead",
&item.ident,
&quote! {
use self::wundergraph::helper::FromLookAheadValue;
use self::wundergraph::juniper::LookAheadValue;
use wundergraph::helper::FromLookAheadValue;
use wundergraph::juniper::LookAheadValue;

impl #impl_generics FromLookAheadValue for #item_name #ty_generics
#where_clause
Expand Down
16 changes: 8 additions & 8 deletions wundergraph_derive/src/inner_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
let to_inner_input_value = build_to_inner_input_value(&model)?;
let register_fields = build_register_fields(&model)?;

let dummy_mod = model.dummy_mod_name("inner_filter");
Ok(wrap_in_dummy_mod(
&dummy_mod,
"inner_filter",
&item_name,
&quote! {
use self::wundergraph::juniper::{self, InputValue, LookAheadValue, Registry};
use self::wundergraph::juniper::meta::Argument;
use self::wundergraph::indexmap::IndexMap;
use self::wundergraph::filter::inner_filter::InnerFilter;
use self::wundergraph::helper::NameBuilder;
use wundergraph::juniper::{self, InputValue, LookAheadValue, Registry};
use wundergraph::juniper::meta::Argument;
use wundergraph::indexmap::IndexMap;
use wundergraph::filter::inner_filter::InnerFilter;
use wundergraph::helper::NameBuilder;

impl #impl_generics InnerFilter for #item_name #ty_generics
#where_clause
Expand Down Expand Up @@ -97,7 +97,7 @@ fn build_from_look_ahead(model: &Model) -> Result<TokenStream, Diagnostic> {
quote!{
let #field_name = obj.iter()
.find(|o| o.0 == stringify!(#graphq_name))
.and_then(|o| <#ty as self::wundergraph::helper::FromLookAheadValue>::from_look_ahead(&o.1))
.and_then(|o| <#ty as wundergraph::helper::FromLookAheadValue>::from_look_ahead(&o.1))
#map_box;
}
});
Expand Down
6 changes: 3 additions & 3 deletions wundergraph_derive/src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,8 @@ impl Model {
})
.unwrap_or_else(|_| {
Ok(parse_quote!{
self::wundergraph::diesel::r2d2::PooledConnection<
self::wundergraph::diesel::r2d2::ConnectionManager<
wundergraph::diesel::r2d2::PooledConnection<
wundergraph::diesel::r2d2::ConnectionManager<
#connection
>
>
Expand All @@ -144,7 +144,7 @@ impl Model {
.get_flag::<syn::Path>("query_modifier")
.unwrap_or_else(|_| {
parse_quote!{
self::wundergraph::query_modifier::DefaultModifier<Self::Context, Self>
wundergraph::query_modifier::DefaultModifier<Self::Context, Self>
}
})
}
Expand Down
11 changes: 4 additions & 7 deletions wundergraph_derive/src/nameable.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
use diagnostic_shim::Diagnostic;
use proc_macro2::{Span, TokenStream};
use proc_macro2::TokenStream;
use syn;
use utils::wrap_in_dummy_mod;

pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
let item_name = &item.ident;
let (impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();

let dummy_mod = format!(
"_impl_nameable_for_{}",
item.ident.to_string().to_lowercase()
);
Ok(wrap_in_dummy_mod(
&syn::Ident::new(&dummy_mod, Span::call_site()),
"nameable",
item_name,
&quote! {
use self::wundergraph::helper::Nameable;
use wundergraph::helper::Nameable;

impl #impl_generics Nameable for #item_name #ty_generics
#where_clause
Expand Down
36 changes: 13 additions & 23 deletions wundergraph_derive/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,35 +1,25 @@
use proc_macro2::{Span, TokenStream};
use proc_macro2::{Ident, Span, TokenStream};
use syn::*;

pub fn wrap_in_dummy_mod(const_name: &Ident, item: &TokenStream) -> TokenStream {
wrap_in_dummy_mod_with_reeport(const_name, item, &[])
}

pub fn wrap_in_dummy_mod_with_reeport(
const_name: &Ident,
pub fn wrap_in_dummy_mod(
name_place_holder: &str,
ident: &Ident,
item: &TokenStream,
reexport: &[TokenStream],
) -> TokenStream {
let reexport = reexport.iter().map(|r| {
quote!{
#[doc(inline)]
pub use self::#const_name::#r;
}
});
let call_site = root_span(Span::call_site());
let use_everything = quote_spanned!(call_site=> __wundergraph_use_everything!());
quote! {
#[allow(non_snake_case)]
mod #const_name {
// https://github.com/rust-lang/rust/issues/47314
let const_name = Ident::new(
&format!("_impl_{}_for_{}", name_place_holder, ident.to_string()).to_uppercase(),
call_site,
);
quote!{
#[doc(hidden)]
const #const_name: () = {
extern crate std;

mod wundergraph {
#use_everything;
__wundergraph_use_everything!();
}
#item
}
#(#reexport)*
};
}
}

Expand Down
Loading

0 comments on commit 0fb463e

Please sign in to comment.