1
+ mod changeset_builder_impl_block;
1
2
mod changeset_decl;
2
3
mod changeset_from_model;
3
4
mod identifiable_impl;
@@ -8,14 +9,15 @@ mod row_decl;
8
9
9
10
use proc_macro2:: { Span , TokenStream } ;
10
11
use quote:: quote;
11
- use syn:: parse_quote;
12
12
13
13
use crate :: modelv2:: codegen:: changeset_decl:: ChangesetDecl ;
14
14
use crate :: modelv2:: codegen:: changeset_decl:: ChangesetFieldDecl ;
15
15
use crate :: modelv2:: codegen:: model_impl:: ModelImpl ;
16
16
use crate :: modelv2:: codegen:: row_decl:: RowDecl ;
17
17
use crate :: modelv2:: codegen:: row_decl:: RowFieldDecl ;
18
18
19
+ use self :: changeset_builder_impl_block:: BuilderType ;
20
+ use self :: changeset_builder_impl_block:: ChangesetBuilderImplBlock ;
19
21
use self :: changeset_from_model:: ChangesetFromModelImpl ;
20
22
use self :: identifiable_impl:: IdentifiableImpl ;
21
23
use self :: model_from_row_impl:: ModelFromRowImpl ;
@@ -71,65 +73,26 @@ impl ModelConfig {
71
73
}
72
74
}
73
75
74
- pub fn make_builder ( & self , changeset : bool ) -> TokenStream {
75
- let np ! ( fields, fns, flat_fns, types, bodies, flat_bodies) : np ! ( vec6) = self
76
- . iter_fields ( )
77
- . filter ( |f| !self . is_primary ( f) )
78
- . filter ( |field| !field. builder_skip )
79
- . map ( |field| {
80
- let ident = & field. ident ;
81
- let expr = field. into_transformed ( parse_quote ! { #ident } ) ;
82
- let body = if changeset {
83
- quote ! { self . #ident = Some ( #expr) }
84
- } else {
85
- quote ! { self . changeset. #ident = Some ( #expr) }
86
- } ;
87
- let flat_body = if changeset {
88
- quote ! { self . #ident = #ident. map( |#ident| #expr) }
89
- } else {
90
- quote ! { self . changeset. #ident = #ident. map( |#ident| #expr) }
91
- } ;
92
- np ! (
93
- ident,
94
- & field. builder_ident,
95
- syn:: Ident :: new( & format!( "flat_{}" , & field. builder_ident) , Span :: call_site( ) ) ,
96
- & field. ty,
97
- body,
98
- flat_body
99
- )
100
- } )
101
- . unzip ( ) ;
102
-
103
- let impl_decl = if changeset {
104
- let tn = self . changeset . ident ( ) ;
105
- quote ! { impl #tn }
106
- } else {
107
- let tn = & self . model ;
108
- quote ! { impl <' a> crate :: modelsv2:: Patch <' a, #tn> }
109
- } ;
110
-
111
- quote ! {
112
- #[ automatically_derived]
113
- #impl_decl {
114
- #(
115
- #[ allow( unused) ]
116
- #[ must_use = "builder methods are intended to be chained" ]
117
- pub fn #fns( mut self , #fields: #types) -> Self {
118
- #bodies;
119
- self
120
- }
121
-
122
- #[ allow( unused) ]
123
- #[ must_use = "builder methods are intended to be chained" ]
124
- pub fn #flat_fns( mut self , #fields: Option <#types>) -> Self {
125
- #flat_bodies;
126
- self
127
- }
128
- ) *
129
- }
76
+ pub ( crate ) fn changeset_builder_impl_block ( & self ) -> ChangesetBuilderImplBlock {
77
+ ChangesetBuilderImplBlock {
78
+ builder_type : BuilderType :: Changeset ,
79
+ model : self . model . clone ( ) ,
80
+ changeset : self . changeset . ident ( ) ,
81
+ fields : self
82
+ . iter_fields ( )
83
+ . filter ( |field| !self . is_primary ( field) )
84
+ . filter ( |field| !field. builder_skip )
85
+ . cloned ( )
86
+ . collect ( ) ,
130
87
}
131
88
}
132
89
90
+ pub ( crate ) fn patch_builder_impl_block ( & self ) -> ChangesetBuilderImplBlock {
91
+ let mut builder = self . changeset_builder_impl_block ( ) ;
92
+ builder. builder_type = BuilderType :: Patch ;
93
+ builder
94
+ }
95
+
133
96
pub ( crate ) fn identifiable_impls ( & self ) -> Vec < IdentifiableImpl > {
134
97
self . identifiers
135
98
. iter ( )
0 commit comments