Skip to content

Commit 6b71fec

Browse files
refactor: reduce code duplication in fields (#17)
1 parent fb0a053 commit 6b71fec

1 file changed

Lines changed: 55 additions & 80 deletions

File tree

  • packages/fortifier-macros/src/validate

packages/fortifier-macros/src/validate/fields.rs

Lines changed: 55 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -89,46 +89,11 @@ impl ValidateNamedFields {
8989
}
9090

9191
fn error_type(&self) -> (TokenStream, TokenStream) {
92-
let visibility = &self.visibility;
93-
let ident = &self.ident;
94-
let error_ident = &self.error_ident;
95-
96-
let mut error_field_idents = vec![];
97-
let mut error_field_types = vec![];
98-
let mut error_field_enums = vec![];
99-
100-
for field in &self.fields {
101-
let field_error_ident = field.error_ident();
102-
let (field_error_type, field_error_enum) = field.error_type(ident);
103-
104-
error_field_idents.push(field_error_ident.clone());
105-
error_field_types.push(field_error_type);
106-
if let Some(error_enum) = field_error_enum {
107-
error_field_enums.push(error_enum);
108-
}
109-
}
110-
111-
(
112-
error_ident.to_token_stream(),
113-
quote! {
114-
#[allow(dead_code)]
115-
#[derive(Debug)]
116-
#visibility enum #error_ident {
117-
#( #error_field_idents(#error_field_types) ),*
118-
}
119-
120-
#[automatically_derived]
121-
impl ::std::fmt::Display for #error_ident {
122-
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
123-
write!(f, "{self:#?}")
124-
}
125-
}
126-
127-
#[automatically_derived]
128-
impl ::std::error::Error for #error_ident {}
129-
130-
#( #error_field_enums )*
131-
},
92+
error_type(
93+
&self.visibility,
94+
&self.ident,
95+
&self.error_ident,
96+
self.fields.iter(),
13297
)
13398
}
13499

@@ -181,46 +146,11 @@ impl ValidateUnnamedFields {
181146
}
182147

183148
fn error_type(&self) -> (TokenStream, TokenStream) {
184-
let visibility = &self.visibility;
185-
let ident = &self.ident;
186-
let error_ident = &self.error_ident;
187-
188-
let mut error_field_idents = vec![];
189-
let mut error_field_types = vec![];
190-
let mut error_field_enums = vec![];
191-
192-
for field in &self.fields {
193-
let field_error_ident = field.error_ident();
194-
let (field_error_type, field_error_enum) = field.error_type(ident);
195-
196-
error_field_idents.push(field_error_ident.clone());
197-
error_field_types.push(field_error_type);
198-
if let Some(error_enum) = field_error_enum {
199-
error_field_enums.push(error_enum);
200-
}
201-
}
202-
203-
(
204-
error_ident.to_token_stream(),
205-
quote! {
206-
#[allow(dead_code)]
207-
#[derive(Debug)]
208-
#visibility enum #error_ident {
209-
#( #error_field_idents(#error_field_types) ),*
210-
}
211-
212-
#[automatically_derived]
213-
impl ::std::fmt::Display for #error_ident {
214-
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
215-
write!(f, "{self:#?}")
216-
}
217-
}
218-
219-
#[automatically_derived]
220-
impl ::std::error::Error for #error_ident {}
221-
222-
#( #error_field_enums )*
223-
},
149+
error_type(
150+
&self.visibility,
151+
&self.ident,
152+
&self.error_ident,
153+
self.fields.iter(),
224154
)
225155
}
226156

@@ -258,6 +188,51 @@ impl ValidateUnitFields {
258188
}
259189
}
260190

191+
fn error_type<'a>(
192+
visibility: &Visibility,
193+
ident: &Ident,
194+
error_ident: &Ident,
195+
fields: impl Iterator<Item = &'a ValidateField>,
196+
) -> (TokenStream, TokenStream) {
197+
let mut error_field_idents = vec![];
198+
let mut error_field_types = vec![];
199+
let mut error_field_enums = vec![];
200+
201+
for field in fields {
202+
let field_error_ident = field.error_ident();
203+
let (field_error_type, field_error_enum) = field.error_type(ident);
204+
205+
error_field_idents.push(field_error_ident.clone());
206+
error_field_types.push(field_error_type);
207+
if let Some(error_enum) = field_error_enum {
208+
error_field_enums.push(error_enum);
209+
}
210+
}
211+
212+
(
213+
error_ident.to_token_stream(),
214+
quote! {
215+
#[allow(dead_code)]
216+
#[derive(Debug)]
217+
#visibility enum #error_ident {
218+
#( #error_field_idents(#error_field_types) ),*
219+
}
220+
221+
#[automatically_derived]
222+
impl ::std::fmt::Display for #error_ident {
223+
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
224+
write!(f, "{self:#?}")
225+
}
226+
}
227+
228+
#[automatically_derived]
229+
impl ::std::error::Error for #error_ident {}
230+
231+
#( #error_field_enums )*
232+
},
233+
)
234+
}
235+
261236
fn validations<'a>(
262237
execution: Execution,
263238
field_prefix: ValidateFieldPrefix,

0 commit comments

Comments
 (0)