1
1
use diagnostic_shim:: Diagnostic ;
2
+ use field:: Field ;
2
3
use model:: Model ;
3
- use proc_macro2:: { Span , TokenStream } ;
4
+ use proc_macro2:: { Ident , Span , TokenStream } ;
4
5
use syn;
5
- use utils:: {
6
- inner_of_option_ty, inner_ty_arg, is_has_many, is_has_one, is_option_ty,
7
- wrap_in_dummy_mod_with_reeport,
8
- } ;
6
+ use utils:: { inner_of_option_ty, inner_ty_arg, is_has_many, is_has_one, is_option_ty} ;
9
7
10
8
pub fn derive ( item : & syn:: DeriveInput ) -> Result < TokenStream , Diagnostic > {
11
9
let item_name = & item. ident ;
@@ -14,7 +12,6 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
14
12
let table_ty = model. table_type ( ) ?;
15
13
let table = table_ty. to_string ( ) ;
16
14
17
- let dummy_mod = model. dummy_mod_name ( "wundergraph_filter" ) ;
18
15
let fields = model
19
16
. fields ( )
20
17
. iter ( )
@@ -25,85 +22,93 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
25
22
if f. has_flag ( "skip" ) {
26
23
None
27
24
} else if is_has_one ( field_ty) {
28
- let reference_ty =
29
- if is_option_ty ( inner_ty_arg ( field_ty, "HasOne" , 1 ) . expect ( "It's there" ) ) {
30
- quote ! ( self :: wundergraph:: filter:: NullableReferenceFilter )
31
- } else {
32
- quote ! ( self :: wundergraph:: filter:: ReferenceFilter )
33
- } ;
34
- let remote_table = f. remote_table ( ) . map ( |t| quote ! ( #t:: table) ) . unwrap_or_else (
35
- |_| {
36
- let remote_type = inner_of_option_ty (
37
- inner_ty_arg ( & f. ty , "HasOne" , 1 ) . expect ( "It's HasOne" ) ,
38
- ) ;
39
- quote ! {
40
- <#remote_type as diesel:: associations:: HasTable >:: Table
41
- }
42
- } ,
43
- ) ;
44
- let remote_filter = f. filter ( ) . expect ( "Filter is missing" ) ;
25
+ handle_has_one ( f, & table_ty)
26
+ } else if is_has_many ( field_ty) {
27
+ handle_has_many ( f, item_name, & table_ty)
28
+ } else {
45
29
let graphql_name = f. graphql_name ( ) . to_string ( ) ;
46
30
Some ( Ok ( quote ! {
47
31
#[ wundergraph( graphql_name = #graphql_name) ]
48
- #field_name: Option <#reference_ty<
49
- #table_ty:: #sql_name,
50
- #remote_filter,
51
- <#remote_table as diesel:: Table >:: PrimaryKey ,
32
+ #field_name: :: std:: option:: Option <:: wundergraph:: filter:: FilterOption <
33
+ #field_ty,
34
+ #table_ty:: #sql_name,
52
35
>>
53
36
} ) )
54
- } else if is_has_many ( field_ty) {
55
- let reference_ty = if f. is_nullable_reference ( ) {
56
- quote ! ( self :: wundergraph:: filter:: ReverseNullableReferenceFilter )
57
- } else {
58
- quote ! ( self :: wundergraph:: filter:: ReferenceFilter )
59
- } ;
60
- let remote_table = f. remote_table ( ) . map ( |t| quote ! ( #t) ) . unwrap_or_else ( |_| {
37
+ }
38
+ } ) . collect :: < Result < Vec < _ > , _ > > ( ) ?;
39
+
40
+ Ok ( quote ! {
41
+ #[ derive( Nameable , Debug , Clone , BuildFilter , InnerFilter ) ]
42
+ #[ wundergraph( table_name = #table) ]
43
+ pub struct #filter_name {
44
+ #( #fields, ) *
45
+ }
46
+ } )
47
+ }
48
+
49
+ fn handle_has_many (
50
+ f : & Field ,
51
+ item_name : & Ident ,
52
+ table_ty : & Ident ,
53
+ ) -> Option < Result < TokenStream , Diagnostic > > {
54
+ let field_name = f. rust_name ( ) ;
55
+ let reference_ty = if f. is_nullable_reference ( ) {
56
+ quote ! ( :: wundergraph:: filter:: ReverseNullableReferenceFilter )
57
+ } else {
58
+ quote ! ( :: wundergraph:: filter:: ReferenceFilter )
59
+ } ;
60
+ let remote_table = f. remote_table ( ) . map ( |t| quote ! ( #t) ) . unwrap_or_else ( |_| {
61
61
let remote_type = inner_ty_arg ( inner_of_option_ty ( & f. ty ) , "HasMany" , 0 )
62
62
. expect ( "It is HasMany" ) ;
63
- quote ! ( <<#remote_type as diesel:: associations:: BelongsTo <#item_name>>:: ForeignKeyColumn as diesel:: Column >:: Table )
63
+ quote ! ( <<#remote_type as :: wundergraph :: diesel:: associations:: BelongsTo <#item_name>>:: ForeignKeyColumn as :: wundergraph :: diesel:: Column >:: Table )
64
64
} ) ;
65
- let foreign_key = f
65
+ let foreign_key = f
66
66
. foreign_key ( )
67
67
. map ( |k| quote ! ( #remote_table:: #k) )
68
68
. unwrap_or_else ( |_| {
69
69
let remote_type = inner_ty_arg ( inner_of_option_ty ( & f. ty ) , "HasMany" , 0 )
70
70
. expect ( "It is HasMany" ) ;
71
- quote ! ( <#remote_type as diesel:: associations:: BelongsTo <#item_name>>:: ForeignKeyColumn )
71
+ quote ! ( <#remote_type as :: wundergraph :: diesel:: associations:: BelongsTo <#item_name>>:: ForeignKeyColumn )
72
72
} ) ;
73
- let remote_filter = f. filter ( ) . expect ( "Filter is missing" ) ;
74
- let graphql_name = f. graphql_name ( ) . to_string ( ) ;
75
- Some ( Ok ( quote ! {
76
- #[ wundergraph( graphql_name = #graphql_name) ]
77
- #field_name: Option <#reference_ty<
78
- <#table_ty:: table as diesel:: Table >:: PrimaryKey ,
79
- #remote_filter,
80
- #foreign_key,
81
- >>
82
- } ) )
83
- } else {
84
- let graphql_name = f. graphql_name ( ) . to_string ( ) ;
85
- Some ( Ok ( quote ! {
86
- #[ wundergraph( graphql_name = #graphql_name) ]
87
- #field_name: Option <self :: wundergraph:: filter:: FilterOption <
88
- #field_ty,
89
- #table_ty:: #sql_name,
90
- >>
91
- } ) )
92
- }
93
- } )
94
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
95
-
96
- Ok ( wrap_in_dummy_mod_with_reeport (
97
- & dummy_mod,
98
- & quote ! {
99
- use self :: wundergraph:: diesel;
73
+ let remote_filter = f. filter ( ) . expect ( "Filter is missing" ) ;
74
+ let graphql_name = f. graphql_name ( ) . to_string ( ) ;
75
+ Some ( Ok ( quote ! {
76
+ #[ wundergraph( graphql_name = #graphql_name) ]
77
+ #field_name: :: std:: option:: Option <#reference_ty<
78
+ <#table_ty:: table as :: wundergraph:: diesel:: Table >:: PrimaryKey ,
79
+ #remote_filter,
80
+ #foreign_key,
81
+ >>
82
+ } ) )
83
+ }
100
84
101
- #[ derive( Nameable , BuildFilter , InnerFilter , Debug , Clone ) ]
102
- #[ wundergraph( table_name = #table) ]
103
- pub struct #filter_name {
104
- #( #fields, ) *
85
+ fn handle_has_one ( f : & Field , table_ty : & Ident ) -> Option < Result < TokenStream , Diagnostic > > {
86
+ let field_name = f. rust_name ( ) ;
87
+ let field_ty = & f. ty ;
88
+ let sql_name = f. sql_name ( ) ;
89
+ let reference_ty = if is_option_ty ( inner_ty_arg ( field_ty, "HasOne" , 1 ) . expect ( "It's there" ) ) {
90
+ quote ! ( :: wundergraph:: filter:: NullableReferenceFilter )
91
+ } else {
92
+ quote ! ( :: wundergraph:: filter:: ReferenceFilter )
93
+ } ;
94
+ let remote_table = f
95
+ . remote_table ( )
96
+ . map ( |t| quote ! ( #t:: table) )
97
+ . unwrap_or_else ( |_| {
98
+ let remote_type =
99
+ inner_of_option_ty ( inner_ty_arg ( & f. ty , "HasOne" , 1 ) . expect ( "It's HasOne" ) ) ;
100
+ quote ! {
101
+ <#remote_type as :: wundergraph:: diesel:: associations:: HasTable >:: Table
105
102
}
106
- } ,
107
- & [ quote ! ( #filter_name) ] ,
108
- ) )
103
+ } ) ;
104
+ let remote_filter = f. filter ( ) . expect ( "Filter is missing" ) ;
105
+ let graphql_name = f. graphql_name ( ) . to_string ( ) ;
106
+ Some ( Ok ( quote ! {
107
+ #[ wundergraph( graphql_name = #graphql_name) ]
108
+ #field_name: :: std:: option:: Option <#reference_ty<
109
+ #table_ty:: #sql_name,
110
+ #remote_filter,
111
+ <#remote_table as :: wundergraph:: diesel:: Table >:: PrimaryKey ,
112
+ >>
113
+ } ) )
109
114
}
0 commit comments