Skip to content

Commit e43392b

Browse files
committed
wip
1 parent 0bb17df commit e43392b

File tree

4 files changed

+269
-129
lines changed

4 files changed

+269
-129
lines changed

module/core/former/examples/former_collection_vector.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ fn main() {}
1414
any(feature = "use_alloc", not(feature = "no_std"))
1515
))]
1616
fn main() {
17-
#[derive(Debug, PartialEq, Default, former::Former)]
18-
#[debug]
17+
use former::Former;
18+
19+
#[derive(Debug, PartialEq, Default, Former)]
1920
pub struct StructWithVec {
20-
#[subform_collection( definition = former::VectorDefinition )]
2121
vec: Vec<String>,
2222
}
2323

24-
let instance = StructWithVec::former().vec().add("apple".to_string()).add("banana".to_string()).end().form();
24+
let instance = StructWithVec::former().vec(vec!["apple".to_string(), "banana".to_string()]).form();
2525

2626
assert_eq!(
2727
instance,

module/core/former_meta/src/derive_former.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub fn mutator(
3535
former_definition_types_generics_impl: &syn::punctuated::Punctuated<syn::GenericParam, syn::token::Comma>,
3636
former_definition_types_generics_ty: &syn::punctuated::Punctuated<syn::GenericParam, syn::token::Comma>,
3737
former_definition_types_generics_where: &syn::punctuated::Punctuated<syn::WherePredicate, syn::token::Comma>,
38+
former_definition_types_ref: &proc_macro2::TokenStream,
3839
) -> Result<TokenStream> {
3940
let former_mutator_code = if mutator.custom.value(false) {
4041
// If custom mutator is requested via #[ mutator( custom ) ], generate nothing, assuming user provides the impl.
@@ -43,7 +44,7 @@ pub fn mutator(
4344
// Otherwise, generate a default empty impl.
4445
quote! {
4546
impl< #former_definition_types_generics_impl > former::FormerMutator
46-
for #former_definition_types < #former_definition_types_generics_ty >
47+
for #former_definition_types_ref
4748
where
4849
#former_definition_types_generics_where
4950
{

module/core/former_meta/src/derive_former/field.rs

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,10 @@ field : {field_ident}",
478478
qt! { #item< #struct_generics_ty > }
479479
};
480480

481+
// Generate the correct former type with or without generics
482+
// Note: former_generics_ty always contains at least 'Definition' for formers
483+
let former_type_ref = qt! { #former< Definition > };
484+
481485
#[allow(clippy::useless_attribute, clippy::items_after_statements)]
482486
use convert_case::{Case, Casing};
483487

@@ -507,16 +511,16 @@ field : {field_ident}",
507511
#def_type // <<< Use the parsed syn::Type directly
508512
<
509513
#( #params, )*
510-
#former< #former_generics_ty >,
511-
#former< #former_generics_ty >,
512-
#subform_collection_end< Definition >,
514+
#former_type_ref,
515+
#former_type_ref,
516+
#subform_collection_end< Definition >
513517
>
514518
}
515519
// former::VectorDefinition< String, Self, Self, Struct1SubformCollectionVec1End, >
516520
} else {
517521
qt! {
518522
<
519-
#field_typ as former::EntityToDefinition< #former< #former_generics_ty >, #former< #former_generics_ty >, #subform_collection_end< Definition > >
523+
#field_typ as former::EntityToDefinition< #former_type_ref, #former_type_ref, #subform_collection_end< Definition > >
520524
>::Definition
521525
}
522526
// < Vec< String > as former::EntityToDefinition< Self, Self, Struct1SubformCollectionVec1End > >::Definition
@@ -539,7 +543,7 @@ field : {field_ident}",
539543
<
540544
// Storage : former::CollectionAdd< Entry = < #field_typ as former::Collection >::Entry >,
541545
Storage = #field_typ,
542-
Context = #former< #former_generics_ty >,
546+
Context = #former_type_ref,
543547
End = #subform_collection_end< Definition >,
544548
>,
545549
#subformer_definition::Storage : 'a,
@@ -574,15 +578,11 @@ field : {field_ident}",
574578
<
575579
// Storage : former::CollectionAdd< Entry = < #field_typ as former::Collection >::Entry >,
576580
Storage = #field_typ,
577-
Context = #former< #former_generics_ty >,
581+
Context = #former_type_ref,
578582
End = #subform_collection_end < Definition >,
579583
>,
580584
{
581-
self.#subform_collection::< former::CollectionFormer::
582-
<
583-
_,
584-
_,
585-
> > ()
585+
self.#subform_collection::< former::CollectionFormer< _, _ > >()
586586
}
587587

588588
}
@@ -595,7 +595,7 @@ field : {field_ident}",
595595
r"
596596
/// The collection setter provides a collection setter that returns a CollectionFormer tailored for managing a collection of child entities. It employs a generic collection definition to facilitate operations on the entire collection, such as adding or updating elements.
597597
598-
impl< Definition, > {former}< Definition, >
598+
impl< Definition > {former}< Definition >
599599
where
600600
Definition : former::FormerDefinition< Storage = {former_storage} >,
601601
{{
@@ -650,21 +650,22 @@ with the new content generated during the subforming process.
650650
let subformer_definition_types_string = format!("{}Types", qt! { #def_type });
651651
let subformer_definition_types: syn::Type = syn::parse_str(&subformer_definition_types_string)?;
652652
// <<< End Revert >>>
653-
qt! {
654-
#subformer_definition_types
655-
<
656-
#( #params, )*
657-
#former< #former_generics_ty >,
658-
#former< #former_generics_ty >,
653+
// Use the parsed definition types but ensure proper comma handling
654+
let element_type = params.first().expect("Expected element type parameter");
655+
quote::quote! {
656+
#subformer_definition_types<
657+
#element_type,
658+
#former_type_ref,
659+
#former_type_ref
659660
>
660661
}
661662
} else {
662663
qt! {
663664
<
664665
#field_typ as former::EntityToDefinitionTypes
665666
<
666-
#former< #former_generics_ty >,
667-
#former< #former_generics_ty >,
667+
#former_type_ref,
668+
#former_type_ref
668669
>
669670
>::Types
670671
}
@@ -694,7 +695,7 @@ with the new content generated during the subforming process.
694695
}
695696

696697
#[ automatically_derived ]
697-
impl< #former_generics_impl > former::FormingEnd< #subformer_definition_types >
698+
impl< Definition > former::FormingEnd< #subformer_definition_types >
698699
for #subform_collection_end< Definition >
699700
where
700701
#former_generics_where
@@ -704,9 +705,9 @@ with the new content generated during the subforming process.
704705
(
705706
&self,
706707
storage : #field_typ,
707-
super_former : Option< #former< #former_generics_ty > >,
708+
super_former : Option< #former_type_ref >,
708709
)
709-
-> #former< #former_generics_ty >
710+
-> #former_type_ref
710711
{
711712
let mut super_former = super_former.unwrap();
712713
if let Some( ref mut field ) = super_former.storage.#field_ident
@@ -755,6 +756,10 @@ with the new content generated during the subforming process.
755756
let field_typ = self.non_optional_ty;
756757
let entry_typ: &syn::Type = typ::parameter_first(field_typ)?;
757758

759+
// Generate the correct former type with or without generics
760+
// Note: former_generics_ty always contains at least 'Definition' for formers
761+
let former_type_ref = qt! { #former< Definition > };
762+
758763
let attr = self.attrs.subform_entry.as_ref().unwrap();
759764
// let params = typ::type_parameters( &self.non_optional_ty, .. );
760765

@@ -964,7 +969,7 @@ formation process of the `{item}`.
964969
}
965970
}
966971

967-
impl< #struct_generics_impl Types2, Definition > former::FormingEnd< Types2, >
972+
impl< #struct_generics_impl Types2, Definition > former::FormingEnd< Types2 >
968973
for #subform_entry_end< Definition >
969974
where
970975
Definition : former::FormerDefinition
@@ -974,8 +979,8 @@ formation process of the `{item}`.
974979
Types2 : former::FormerDefinitionTypes
975980
<
976981
Storage = < < #field_typ as former::Collection >::Val as former::EntityToStorage >::Storage,
977-
Formed = #former< #former_generics_ty >,
978-
Context = #former< #former_generics_ty >,
982+
Formed = #former_type_ref,
983+
Context = #former_type_ref,
979984
>,
980985
#struct_generics_where
981986
{
@@ -1037,6 +1042,10 @@ formation process of the `{item}`.
10371042
let field_ident = self.ident;
10381043
let field_typ = self.non_optional_ty;
10391044
let attr = self.attrs.subform_scalar.as_ref().unwrap();
1045+
1046+
// Generate the correct former type with or without generics
1047+
// Note: former_generics_ty always contains at least 'Definition' for formers
1048+
let former_type_ref = qt! { #former< Definition > };
10401049
// let params = typ::type_parameters( &self.non_optional_ty, .. );
10411050

10421051
// example : `children`
@@ -1265,7 +1274,7 @@ Essentially, this end action integrates the individually formed scalar value bac
12651274
}
12661275
}
12671276

1268-
impl< #struct_generics_impl Types2, Definition > former::FormingEnd< Types2, >
1277+
impl< #struct_generics_impl Types2, Definition > former::FormingEnd< Types2 >
12691278
for #subform_scalar_end< Definition >
12701279
where
12711280
Definition : former::FormerDefinition
@@ -1275,8 +1284,8 @@ Essentially, this end action integrates the individually formed scalar value bac
12751284
Types2 : former::FormerDefinitionTypes
12761285
<
12771286
Storage = < #field_typ as former::EntityToStorage >::Storage,
1278-
Formed = #former< #former_generics_ty >,
1279-
Context = #former< #former_generics_ty >,
1287+
Formed = #former_type_ref,
1288+
Context = #former_type_ref,
12801289
>,
12811290
#struct_generics_where
12821291
{

0 commit comments

Comments
 (0)