diff --git a/packages/fortifier-macros/src/lib.rs b/packages/fortifier-macros/src/lib.rs index 54a9008..a649900 100644 --- a/packages/fortifier-macros/src/lib.rs +++ b/packages/fortifier-macros/src/lib.rs @@ -17,7 +17,7 @@ use crate::validate::Validate; pub fn derive(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); - Validate::parse(input) + Validate::parse(&input) .map(|validate| validate.to_token_stream()) .unwrap_or_else(Error::into_compile_error) .into() diff --git a/packages/fortifier-macros/src/validate.rs b/packages/fortifier-macros/src/validate.rs index d065469..9c64cc7 100644 --- a/packages/fortifier-macros/src/validate.rs +++ b/packages/fortifier-macros/src/validate.rs @@ -11,23 +11,23 @@ use syn::{Data, DeriveInput, Result}; use crate::validate::{r#enum::ValidateEnum, r#struct::ValidateStruct, union::ValidateUnion}; -pub enum Validate { - Struct(ValidateStruct), - Enum(ValidateEnum), +pub enum Validate<'a> { + Struct(ValidateStruct<'a>), + Enum(ValidateEnum<'a>), Union(ValidateUnion), } -impl Validate { - pub fn parse(input: DeriveInput) -> Result { +impl<'a> Validate<'a> { + pub fn parse(input: &'a DeriveInput) -> Result { Ok(match &input.data { - Data::Struct(data) => Self::Struct(ValidateStruct::parse(&input, data)?), - Data::Enum(data) => Self::Enum(ValidateEnum::parse(&input, data)?), - Data::Union(data) => Self::Union(ValidateUnion::parse(&input, data)?), + Data::Struct(data) => Self::Struct(ValidateStruct::parse(input, data)?), + Data::Enum(data) => Self::Enum(ValidateEnum::parse(input, data)?), + Data::Union(data) => Self::Union(ValidateUnion::parse(input, data)?), }) } } -impl ToTokens for Validate { +impl<'a> ToTokens for Validate<'a> { fn to_tokens(&self, tokens: &mut TokenStream) { match self { Validate::Struct(r#struct) => r#struct.to_tokens(tokens), diff --git a/packages/fortifier-macros/src/validate/enum.rs b/packages/fortifier-macros/src/validate/enum.rs index fb93119..305d02f 100644 --- a/packages/fortifier-macros/src/validate/enum.rs +++ b/packages/fortifier-macros/src/validate/enum.rs @@ -11,29 +11,29 @@ use crate::{ validation::Execution, }; -pub struct ValidateEnum { - visibility: Visibility, - ident: Ident, +pub struct ValidateEnum<'a> { + visibility: &'a Visibility, + ident: &'a Ident, error_ident: Ident, - generics: Generics, - variants: Vec, + generics: &'a Generics, + variants: Vec>, } -impl ValidateEnum { - pub fn parse(input: &DeriveInput, data: &DataEnum) -> Result { +impl<'a> ValidateEnum<'a> { + pub fn parse(input: &'a DeriveInput, data: &'a DataEnum) -> Result { let mut result = ValidateEnum { - visibility: input.vis.clone(), - ident: input.ident.clone(), + visibility: &input.vis, + ident: &input.ident, error_ident: format_ident!("{}ValidationError", input.ident), - generics: input.generics.clone(), + generics: &input.generics, variants: Vec::with_capacity(data.variants.len()), }; for variant in &data.variants { result.variants.push(ValidateEnumVariant::parse( &input.vis, - &result.ident, - &result.error_ident, + result.ident, + result.error_ident.clone(), variant, )?); } @@ -41,7 +41,7 @@ impl ValidateEnum { Ok(result) } - fn error_type(&self) -> (Ident, TokenStream) { + fn error_type(&self) -> (&Ident, TokenStream) { let visibility = &self.visibility; let error_ident = &self.error_ident; @@ -58,7 +58,7 @@ impl ValidateEnum { .collect::>(); ( - error_ident.clone(), + error_ident, quote! { #[allow(dead_code)] #[derive(Debug)] @@ -81,7 +81,7 @@ impl ValidateEnum { } } -impl ToTokens for ValidateEnum { +impl<'a> ToTokens for ValidateEnum<'a> { fn to_tokens(&self, tokens: &mut TokenStream) { let ident = &self.ident; let (impl_generics, type_generics, where_clause) = &self.generics.split_for_impl(); @@ -124,27 +124,27 @@ impl ToTokens for ValidateEnum { } } -pub struct ValidateEnumVariant { - enum_ident: Ident, +pub struct ValidateEnumVariant<'a> { + enum_ident: &'a Ident, enum_error_ident: Ident, - ident: Ident, - fields: ValidateFields, + ident: &'a Ident, + fields: ValidateFields<'a>, } -impl ValidateEnumVariant { +impl<'a> ValidateEnumVariant<'a> { pub fn parse( - visibility: &Visibility, - enum_ident: &Ident, - enum_error_ident: &Ident, - variant: &Variant, + visibility: &'a Visibility, + enum_ident: &'a Ident, + enum_error_ident: Ident, + variant: &'a Variant, ) -> Result { let result = ValidateEnumVariant { - enum_ident: enum_ident.clone(), - enum_error_ident: enum_error_ident.clone(), - ident: variant.ident.clone(), + enum_ident, + enum_error_ident, + ident: &variant.ident, fields: ValidateFields::parse( visibility, - &format_ident!("{}{}", enum_ident, variant.ident), + format_ident!("{}{}", enum_ident, variant.ident), &variant.fields, )?, }; diff --git a/packages/fortifier-macros/src/validate/field.rs b/packages/fortifier-macros/src/validate/field.rs index 6af6d96..28a50e7 100644 --- a/packages/fortifier-macros/src/validate/field.rs +++ b/packages/fortifier-macros/src/validate/field.rs @@ -30,17 +30,17 @@ pub enum ValidateFieldPrefix { F, } -pub struct ValidateField { - visibility: Visibility, +pub struct ValidateField<'a> { + visibility: &'a Visibility, ident: LiteralOrIdent, error_ident: Ident, error_type_ident: Ident, validations: Vec>, } -impl ValidateField { +impl<'a> ValidateField<'a> { pub fn parse( - visibility: &Visibility, + visibility: &'a Visibility, type_prefix: &Ident, ident: LiteralOrIdent, field: &Field, @@ -54,7 +54,7 @@ impl ValidateField { let error_type_ident = format_ident!("{type_prefix}{error_ident}ValidationError"); let mut result = Self { - visibility: visibility.clone(), + visibility, ident, error_ident, error_type_ident, diff --git a/packages/fortifier-macros/src/validate/fields.rs b/packages/fortifier-macros/src/validate/fields.rs index 9f789bc..c291422 100644 --- a/packages/fortifier-macros/src/validate/fields.rs +++ b/packages/fortifier-macros/src/validate/fields.rs @@ -10,14 +10,14 @@ use crate::{ validation::Execution, }; -pub enum ValidateFields { - Named(ValidateNamedFields), - Unnamed(ValidateUnnamedFields), +pub enum ValidateFields<'a> { + Named(ValidateNamedFields<'a>), + Unnamed(ValidateUnnamedFields<'a>), Unit(ValidateUnitFields), } -impl ValidateFields { - pub fn parse(visibility: &Visibility, ident: &Ident, fields: &Fields) -> Result { +impl<'a> ValidateFields<'a> { + pub fn parse(visibility: &'a Visibility, ident: Ident, fields: &'a Fields) -> Result { Ok(match fields { Fields::Named(fields) => { Self::Named(ValidateNamedFields::parse(visibility, ident, fields)?) @@ -55,19 +55,21 @@ impl ValidateFields { } } -pub struct ValidateNamedFields { - visibility: Visibility, +pub struct ValidateNamedFields<'a> { + visibility: &'a Visibility, ident: Ident, error_ident: Ident, - fields: Vec, + fields: Vec>, } -impl ValidateNamedFields { - fn parse(visibility: &Visibility, ident: &Ident, fields: &FieldsNamed) -> Result { +impl<'a> ValidateNamedFields<'a> { + fn parse(visibility: &'a Visibility, ident: Ident, fields: &'a FieldsNamed) -> Result { + let error_ident = format_ident!("{}ValidationError", ident); + let mut result = Self { - visibility: visibility.clone(), - ident: ident.clone(), - error_ident: format_ident!("{}ValidationError", ident), + visibility, + ident, + error_ident, fields: Vec::with_capacity(fields.named.len()), }; @@ -78,7 +80,7 @@ impl ValidateNamedFields { result.fields.push(ValidateField::parse( visibility, - ident, + &result.ident, LiteralOrIdent::Ident(field_ident.clone()), field, )?); @@ -93,7 +95,7 @@ impl ValidateNamedFields { fn error_type(&self) -> (TokenStream, TokenStream) { error_type( - &self.visibility, + self.visibility, &self.ident, &self.error_ident, self.fields.iter(), @@ -116,26 +118,28 @@ impl ValidateNamedFields { } } -pub struct ValidateUnnamedFields { - visibility: Visibility, +pub struct ValidateUnnamedFields<'a> { + visibility: &'a Visibility, ident: Ident, error_ident: Ident, - fields: Vec, + fields: Vec>, } -impl ValidateUnnamedFields { - fn parse(visibility: &Visibility, ident: &Ident, fields: &FieldsUnnamed) -> Result { +impl<'a> ValidateUnnamedFields<'a> { + fn parse(visibility: &'a Visibility, ident: Ident, fields: &'a FieldsUnnamed) -> Result { + let error_ident = format_ident!("{}ValidationError", ident); + let mut result = Self { - visibility: visibility.clone(), - ident: ident.clone(), - error_ident: format_ident!("{}ValidationError", ident), + visibility, + ident, + error_ident, fields: Vec::with_capacity(fields.unnamed.len()), }; for (index, field) in fields.unnamed.iter().enumerate() { result.fields.push(ValidateField::parse( visibility, - ident, + &result.ident, LiteralOrIdent::Literal(Literal::usize_unsuffixed(index)), field, )?); @@ -150,7 +154,7 @@ impl ValidateUnnamedFields { fn error_type(&self) -> (TokenStream, TokenStream) { error_type( - &self.visibility, + self.visibility, &self.ident, &self.error_ident, self.fields.iter(), @@ -195,7 +199,7 @@ fn error_type<'a>( visibility: &Visibility, ident: &Ident, error_ident: &Ident, - fields: impl Iterator, + fields: impl Iterator>, ) -> (TokenStream, TokenStream) { let attributes = enum_attributes(); @@ -207,7 +211,7 @@ fn error_type<'a>( let field_error_ident = field.error_ident(); let (field_error_type, field_error_enum) = field.error_type(ident); - error_field_idents.push(field_error_ident.clone()); + error_field_idents.push(field_error_ident); error_field_types.push(field_error_type); if let Some(error_enum) = field_error_enum { error_field_enums.push(error_enum); @@ -244,7 +248,7 @@ fn validations<'a>( field_prefix: ValidateFieldPrefix, error_ident: &Ident, error_wrapper: &impl Fn(TokenStream) -> TokenStream, - fields: impl Iterator, + fields: impl Iterator>, ) -> TokenStream { let error_ident = &error_ident; diff --git a/packages/fortifier-macros/src/validate/struct.rs b/packages/fortifier-macros/src/validate/struct.rs index d105240..6578a6c 100644 --- a/packages/fortifier-macros/src/validate/struct.rs +++ b/packages/fortifier-macros/src/validate/struct.rs @@ -7,23 +7,23 @@ use crate::{ validation::Execution, }; -pub struct ValidateStruct { - ident: Ident, - generics: Generics, - fields: ValidateFields, +pub struct ValidateStruct<'a> { + ident: &'a Ident, + generics: &'a Generics, + fields: ValidateFields<'a>, } -impl ValidateStruct { - pub fn parse(input: &DeriveInput, data: &DataStruct) -> Result { +impl<'a> ValidateStruct<'a> { + pub fn parse(input: &'a DeriveInput, data: &'a DataStruct) -> Result { Ok(ValidateStruct { - ident: input.ident.clone(), - generics: input.generics.clone(), - fields: ValidateFields::parse(&input.vis, &input.ident, &data.fields)?, + ident: &input.ident, + generics: &input.generics, + fields: ValidateFields::parse(&input.vis, input.ident.clone(), &data.fields)?, }) } } -impl ToTokens for ValidateStruct { +impl<'a> ToTokens for ValidateStruct<'a> { fn to_tokens(&self, tokens: &mut TokenStream) { let ident = &self.ident; let (impl_generics, type_generics, where_clause) = self.generics.split_for_impl();