Skip to content

Commit 16b74e2

Browse files
refactor: reduce use of clone (#19)
1 parent b02921f commit 16b74e2

6 files changed

Lines changed: 85 additions & 81 deletions

File tree

packages/fortifier-macros/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::validate::Validate;
1717
pub fn derive(input: TokenStream) -> TokenStream {
1818
let input = parse_macro_input!(input as DeriveInput);
1919

20-
Validate::parse(input)
20+
Validate::parse(&input)
2121
.map(|validate| validate.to_token_stream())
2222
.unwrap_or_else(Error::into_compile_error)
2323
.into()

packages/fortifier-macros/src/validate.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,23 @@ use syn::{Data, DeriveInput, Result};
1111

1212
use crate::validate::{r#enum::ValidateEnum, r#struct::ValidateStruct, union::ValidateUnion};
1313

14-
pub enum Validate {
15-
Struct(ValidateStruct),
16-
Enum(ValidateEnum),
14+
pub enum Validate<'a> {
15+
Struct(ValidateStruct<'a>),
16+
Enum(ValidateEnum<'a>),
1717
Union(ValidateUnion),
1818
}
1919

20-
impl Validate {
21-
pub fn parse(input: DeriveInput) -> Result<Self> {
20+
impl<'a> Validate<'a> {
21+
pub fn parse(input: &'a DeriveInput) -> Result<Self> {
2222
Ok(match &input.data {
23-
Data::Struct(data) => Self::Struct(ValidateStruct::parse(&input, data)?),
24-
Data::Enum(data) => Self::Enum(ValidateEnum::parse(&input, data)?),
25-
Data::Union(data) => Self::Union(ValidateUnion::parse(&input, data)?),
23+
Data::Struct(data) => Self::Struct(ValidateStruct::parse(input, data)?),
24+
Data::Enum(data) => Self::Enum(ValidateEnum::parse(input, data)?),
25+
Data::Union(data) => Self::Union(ValidateUnion::parse(input, data)?),
2626
})
2727
}
2828
}
2929

30-
impl ToTokens for Validate {
30+
impl<'a> ToTokens for Validate<'a> {
3131
fn to_tokens(&self, tokens: &mut TokenStream) {
3232
match self {
3333
Validate::Struct(r#struct) => r#struct.to_tokens(tokens),

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

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,37 @@ use crate::{
1111
validation::Execution,
1212
};
1313

14-
pub struct ValidateEnum {
15-
visibility: Visibility,
16-
ident: Ident,
14+
pub struct ValidateEnum<'a> {
15+
visibility: &'a Visibility,
16+
ident: &'a Ident,
1717
error_ident: Ident,
18-
generics: Generics,
19-
variants: Vec<ValidateEnumVariant>,
18+
generics: &'a Generics,
19+
variants: Vec<ValidateEnumVariant<'a>>,
2020
}
2121

22-
impl ValidateEnum {
23-
pub fn parse(input: &DeriveInput, data: &DataEnum) -> Result<Self> {
22+
impl<'a> ValidateEnum<'a> {
23+
pub fn parse(input: &'a DeriveInput, data: &'a DataEnum) -> Result<Self> {
2424
let mut result = ValidateEnum {
25-
visibility: input.vis.clone(),
26-
ident: input.ident.clone(),
25+
visibility: &input.vis,
26+
ident: &input.ident,
2727
error_ident: format_ident!("{}ValidationError", input.ident),
28-
generics: input.generics.clone(),
28+
generics: &input.generics,
2929
variants: Vec::with_capacity(data.variants.len()),
3030
};
3131

3232
for variant in &data.variants {
3333
result.variants.push(ValidateEnumVariant::parse(
3434
&input.vis,
35-
&result.ident,
36-
&result.error_ident,
35+
result.ident,
36+
result.error_ident.clone(),
3737
variant,
3838
)?);
3939
}
4040

4141
Ok(result)
4242
}
4343

44-
fn error_type(&self) -> (Ident, TokenStream) {
44+
fn error_type(&self) -> (&Ident, TokenStream) {
4545
let visibility = &self.visibility;
4646
let error_ident = &self.error_ident;
4747

@@ -58,7 +58,7 @@ impl ValidateEnum {
5858
.collect::<Vec<_>>();
5959

6060
(
61-
error_ident.clone(),
61+
error_ident,
6262
quote! {
6363
#[allow(dead_code)]
6464
#[derive(Debug)]
@@ -81,7 +81,7 @@ impl ValidateEnum {
8181
}
8282
}
8383

84-
impl ToTokens for ValidateEnum {
84+
impl<'a> ToTokens for ValidateEnum<'a> {
8585
fn to_tokens(&self, tokens: &mut TokenStream) {
8686
let ident = &self.ident;
8787
let (impl_generics, type_generics, where_clause) = &self.generics.split_for_impl();
@@ -124,27 +124,27 @@ impl ToTokens for ValidateEnum {
124124
}
125125
}
126126

127-
pub struct ValidateEnumVariant {
128-
enum_ident: Ident,
127+
pub struct ValidateEnumVariant<'a> {
128+
enum_ident: &'a Ident,
129129
enum_error_ident: Ident,
130-
ident: Ident,
131-
fields: ValidateFields,
130+
ident: &'a Ident,
131+
fields: ValidateFields<'a>,
132132
}
133133

134-
impl ValidateEnumVariant {
134+
impl<'a> ValidateEnumVariant<'a> {
135135
pub fn parse(
136-
visibility: &Visibility,
137-
enum_ident: &Ident,
138-
enum_error_ident: &Ident,
139-
variant: &Variant,
136+
visibility: &'a Visibility,
137+
enum_ident: &'a Ident,
138+
enum_error_ident: Ident,
139+
variant: &'a Variant,
140140
) -> Result<Self> {
141141
let result = ValidateEnumVariant {
142-
enum_ident: enum_ident.clone(),
143-
enum_error_ident: enum_error_ident.clone(),
144-
ident: variant.ident.clone(),
142+
enum_ident,
143+
enum_error_ident,
144+
ident: &variant.ident,
145145
fields: ValidateFields::parse(
146146
visibility,
147-
&format_ident!("{}{}", enum_ident, variant.ident),
147+
format_ident!("{}{}", enum_ident, variant.ident),
148148
&variant.fields,
149149
)?,
150150
};

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,17 @@ pub enum ValidateFieldPrefix {
3030
F,
3131
}
3232

33-
pub struct ValidateField {
34-
visibility: Visibility,
33+
pub struct ValidateField<'a> {
34+
visibility: &'a Visibility,
3535
ident: LiteralOrIdent,
3636
error_ident: Ident,
3737
error_type_ident: Ident,
3838
validations: Vec<Box<dyn Validation>>,
3939
}
4040

41-
impl ValidateField {
41+
impl<'a> ValidateField<'a> {
4242
pub fn parse(
43-
visibility: &Visibility,
43+
visibility: &'a Visibility,
4444
type_prefix: &Ident,
4545
ident: LiteralOrIdent,
4646
field: &Field,
@@ -54,7 +54,7 @@ impl ValidateField {
5454
let error_type_ident = format_ident!("{type_prefix}{error_ident}ValidationError");
5555

5656
let mut result = Self {
57-
visibility: visibility.clone(),
57+
visibility,
5858
ident,
5959
error_ident,
6060
error_type_ident,

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

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ use crate::{
1010
validation::Execution,
1111
};
1212

13-
pub enum ValidateFields {
14-
Named(ValidateNamedFields),
15-
Unnamed(ValidateUnnamedFields),
13+
pub enum ValidateFields<'a> {
14+
Named(ValidateNamedFields<'a>),
15+
Unnamed(ValidateUnnamedFields<'a>),
1616
Unit(ValidateUnitFields),
1717
}
1818

19-
impl ValidateFields {
20-
pub fn parse(visibility: &Visibility, ident: &Ident, fields: &Fields) -> Result<Self> {
19+
impl<'a> ValidateFields<'a> {
20+
pub fn parse(visibility: &'a Visibility, ident: Ident, fields: &'a Fields) -> Result<Self> {
2121
Ok(match fields {
2222
Fields::Named(fields) => {
2323
Self::Named(ValidateNamedFields::parse(visibility, ident, fields)?)
@@ -55,19 +55,21 @@ impl ValidateFields {
5555
}
5656
}
5757

58-
pub struct ValidateNamedFields {
59-
visibility: Visibility,
58+
pub struct ValidateNamedFields<'a> {
59+
visibility: &'a Visibility,
6060
ident: Ident,
6161
error_ident: Ident,
62-
fields: Vec<ValidateField>,
62+
fields: Vec<ValidateField<'a>>,
6363
}
6464

65-
impl ValidateNamedFields {
66-
fn parse(visibility: &Visibility, ident: &Ident, fields: &FieldsNamed) -> Result<Self> {
65+
impl<'a> ValidateNamedFields<'a> {
66+
fn parse(visibility: &'a Visibility, ident: Ident, fields: &'a FieldsNamed) -> Result<Self> {
67+
let error_ident = format_ident!("{}ValidationError", ident);
68+
6769
let mut result = Self {
68-
visibility: visibility.clone(),
69-
ident: ident.clone(),
70-
error_ident: format_ident!("{}ValidationError", ident),
70+
visibility,
71+
ident,
72+
error_ident,
7173
fields: Vec::with_capacity(fields.named.len()),
7274
};
7375

@@ -78,7 +80,7 @@ impl ValidateNamedFields {
7880

7981
result.fields.push(ValidateField::parse(
8082
visibility,
81-
ident,
83+
&result.ident,
8284
LiteralOrIdent::Ident(field_ident.clone()),
8385
field,
8486
)?);
@@ -93,7 +95,7 @@ impl ValidateNamedFields {
9395

9496
fn error_type(&self) -> (TokenStream, TokenStream) {
9597
error_type(
96-
&self.visibility,
98+
self.visibility,
9799
&self.ident,
98100
&self.error_ident,
99101
self.fields.iter(),
@@ -116,26 +118,28 @@ impl ValidateNamedFields {
116118
}
117119
}
118120

119-
pub struct ValidateUnnamedFields {
120-
visibility: Visibility,
121+
pub struct ValidateUnnamedFields<'a> {
122+
visibility: &'a Visibility,
121123
ident: Ident,
122124
error_ident: Ident,
123-
fields: Vec<ValidateField>,
125+
fields: Vec<ValidateField<'a>>,
124126
}
125127

126-
impl ValidateUnnamedFields {
127-
fn parse(visibility: &Visibility, ident: &Ident, fields: &FieldsUnnamed) -> Result<Self> {
128+
impl<'a> ValidateUnnamedFields<'a> {
129+
fn parse(visibility: &'a Visibility, ident: Ident, fields: &'a FieldsUnnamed) -> Result<Self> {
130+
let error_ident = format_ident!("{}ValidationError", ident);
131+
128132
let mut result = Self {
129-
visibility: visibility.clone(),
130-
ident: ident.clone(),
131-
error_ident: format_ident!("{}ValidationError", ident),
133+
visibility,
134+
ident,
135+
error_ident,
132136
fields: Vec::with_capacity(fields.unnamed.len()),
133137
};
134138

135139
for (index, field) in fields.unnamed.iter().enumerate() {
136140
result.fields.push(ValidateField::parse(
137141
visibility,
138-
ident,
142+
&result.ident,
139143
LiteralOrIdent::Literal(Literal::usize_unsuffixed(index)),
140144
field,
141145
)?);
@@ -150,7 +154,7 @@ impl ValidateUnnamedFields {
150154

151155
fn error_type(&self) -> (TokenStream, TokenStream) {
152156
error_type(
153-
&self.visibility,
157+
self.visibility,
154158
&self.ident,
155159
&self.error_ident,
156160
self.fields.iter(),
@@ -195,7 +199,7 @@ fn error_type<'a>(
195199
visibility: &Visibility,
196200
ident: &Ident,
197201
error_ident: &Ident,
198-
fields: impl Iterator<Item = &'a ValidateField>,
202+
fields: impl Iterator<Item = &'a ValidateField<'a>>,
199203
) -> (TokenStream, TokenStream) {
200204
let attributes = enum_attributes();
201205

@@ -207,7 +211,7 @@ fn error_type<'a>(
207211
let field_error_ident = field.error_ident();
208212
let (field_error_type, field_error_enum) = field.error_type(ident);
209213

210-
error_field_idents.push(field_error_ident.clone());
214+
error_field_idents.push(field_error_ident);
211215
error_field_types.push(field_error_type);
212216
if let Some(error_enum) = field_error_enum {
213217
error_field_enums.push(error_enum);
@@ -244,7 +248,7 @@ fn validations<'a>(
244248
field_prefix: ValidateFieldPrefix,
245249
error_ident: &Ident,
246250
error_wrapper: &impl Fn(TokenStream) -> TokenStream,
247-
fields: impl Iterator<Item = &'a ValidateField>,
251+
fields: impl Iterator<Item = &'a ValidateField<'a>>,
248252
) -> TokenStream {
249253
let error_ident = &error_ident;
250254

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ use crate::{
77
validation::Execution,
88
};
99

10-
pub struct ValidateStruct {
11-
ident: Ident,
12-
generics: Generics,
13-
fields: ValidateFields,
10+
pub struct ValidateStruct<'a> {
11+
ident: &'a Ident,
12+
generics: &'a Generics,
13+
fields: ValidateFields<'a>,
1414
}
1515

16-
impl ValidateStruct {
17-
pub fn parse(input: &DeriveInput, data: &DataStruct) -> Result<Self> {
16+
impl<'a> ValidateStruct<'a> {
17+
pub fn parse(input: &'a DeriveInput, data: &'a DataStruct) -> Result<Self> {
1818
Ok(ValidateStruct {
19-
ident: input.ident.clone(),
20-
generics: input.generics.clone(),
21-
fields: ValidateFields::parse(&input.vis, &input.ident, &data.fields)?,
19+
ident: &input.ident,
20+
generics: &input.generics,
21+
fields: ValidateFields::parse(&input.vis, input.ident.clone(), &data.fields)?,
2222
})
2323
}
2424
}
2525

26-
impl ToTokens for ValidateStruct {
26+
impl<'a> ToTokens for ValidateStruct<'a> {
2727
fn to_tokens(&self, tokens: &mut TokenStream) {
2828
let ident = &self.ident;
2929
let (impl_generics, type_generics, where_clause) = self.generics.split_for_impl();

0 commit comments

Comments
 (0)