@@ -56,9 +56,10 @@ impl ValidateNamedStruct {
5656
5757 let expr = quote ! ( self . #field_ident) ;
5858
59- result
60- . fields
61- . insert ( field_ident. clone ( ) , ValidateField :: parse ( expr, field) ?) ;
59+ result. fields . insert (
60+ field_ident. clone ( ) ,
61+ ValidateField :: parse ( & input. ident , field_ident. clone ( ) , expr, field) ?,
62+ ) ;
6263 }
6364
6465 Ok ( result)
@@ -71,15 +72,21 @@ impl ToTokens for ValidateNamedStruct {
7172 let error_ident = & self . error_ident ;
7273 let mut error_field_idents = vec ! [ ] ;
7374 let mut error_field_types = vec ! [ ] ;
75+ let mut error_field_enums = vec ! [ ] ;
7476 let mut sync_validations = vec ! [ ] ;
7577 let mut async_validations = vec ! [ ] ;
7678
7779 for ( field_ident, field) in & self . fields {
7880 let field_error_ident =
7981 format_ident ! ( "{}" , & field_ident. to_string( ) . to_case( Case :: UpperCamel ) ) ;
8082
83+ let ( error_type, error_enum) = field. error_type ( ident, & field_error_ident) ;
84+
8185 error_field_idents. push ( field_error_ident. clone ( ) ) ;
82- error_field_types. push ( field. error_type ( ) ) ;
86+ error_field_types. push ( error_type) ;
87+ if let Some ( error_enum) = error_enum {
88+ error_field_enums. push ( error_enum) ;
89+ }
8390
8491 for validation in field. sync_validations ( ) {
8592 sync_validations. push ( quote ! {
@@ -101,19 +108,25 @@ impl ToTokens for ValidateNamedStruct {
101108 tokens. append_all ( quote ! {
102109 use fortifier:: * ;
103110
111+ #[ allow( dead_code) ]
104112 #[ derive( Debug ) ]
105113 enum #error_ident {
106114 #( #error_field_idents( #error_field_types) ) , *
107115 }
108116
117+ #[ automatically_derived]
109118 impl :: std:: fmt:: Display for #error_ident {
110119 fn fmt( & self , f: & mut :: std:: fmt:: Formatter <' _>) -> :: std:: fmt:: Result {
111120 write!( f, "{self:#?}" )
112121 }
113122 }
114123
124+ #[ automatically_derived]
115125 impl :: std:: error:: Error for #error_ident { }
116126
127+ #( #error_field_enums) *
128+
129+ #[ automatically_derived]
117130 impl Validate for #ident {
118131 type Error = #error_ident;
119132
@@ -163,9 +176,15 @@ impl ValidateUnnamedStruct {
163176
164177 for ( index, field) in fields. unnamed . iter ( ) . enumerate ( ) {
165178 let index = Literal :: usize_unsuffixed ( index) ;
179+ let field_ident = format_ident ! ( "F{index}" ) ;
166180 let expr = quote ! ( self . #index) ;
167181
168- result. fields . push ( ValidateField :: parse ( expr, field) ?) ;
182+ result. fields . push ( ValidateField :: parse (
183+ & input. ident ,
184+ field_ident,
185+ expr,
186+ field,
187+ ) ?) ;
169188 }
170189
171190 Ok ( result)
@@ -178,14 +197,20 @@ impl ToTokens for ValidateUnnamedStruct {
178197 let error_ident = & self . error_ident ;
179198 let mut error_field_idents = vec ! [ ] ;
180199 let mut error_field_types = vec ! [ ] ;
200+ let mut error_field_enums = vec ! [ ] ;
181201 let mut sync_validations = vec ! [ ] ;
182202 let mut async_validations = vec ! [ ] ;
183203
184204 for ( index, field) in self . fields . iter ( ) . enumerate ( ) {
185205 let field_error_ident = format_ident ! ( "F{index}" ) ;
186206
207+ let ( error_type, error_enum) = field. error_type ( ident, & field_error_ident) ;
208+
187209 error_field_idents. push ( field_error_ident. clone ( ) ) ;
188- error_field_types. push ( field. error_type ( ) ) ;
210+ error_field_types. push ( error_type) ;
211+ if let Some ( error_enum) = error_enum {
212+ error_field_enums. push ( error_enum) ;
213+ }
189214
190215 for validation in field. sync_validations ( ) {
191216 sync_validations. push ( quote ! {
@@ -207,19 +232,25 @@ impl ToTokens for ValidateUnnamedStruct {
207232 tokens. append_all ( quote ! {
208233 use fortifier:: * ;
209234
235+ #[ allow( dead_code) ]
210236 #[ derive( Debug ) ]
211237 enum #error_ident {
212238 #( #error_field_idents( #error_field_types) ) , *
213239 }
214240
241+ #[ automatically_derived]
215242 impl :: std:: fmt:: Display for #error_ident {
216243 fn fmt( & self , f: & mut :: std:: fmt:: Formatter <' _>) -> :: std:: fmt:: Result {
217244 write!( f, "{self:#?}" )
218245 }
219246 }
220247
248+ #[ automatically_derived]
221249 impl :: std:: error:: Error for #error_ident { }
222250
251+ #( #error_field_enums) *
252+
253+ #[ automatically_derived]
223254 impl Validate for #ident {
224255 type Error = #error_ident;
225256
@@ -272,6 +303,7 @@ impl ToTokens for ValidateUnitStruct {
272303 tokens. append_all ( quote ! {
273304 use fortifier:: ValidationErrors ;
274305
306+ #[ automatically_derived]
275307 impl Validate for #ident {
276308 type Error = :: std:: convert:: Infallible ;
277309
0 commit comments