From 97e0d2c5cf687d9296ad817e4aa764e209eafc80 Mon Sep 17 00:00:00 2001 From: wandalen Date: Sat, 30 Mar 2024 21:28:17 +0200 Subject: [PATCH] former : experimenting --- .../a_containers_with_subformer_2_manual.rs | 3 +- .../a_containers_with_subformer_manual.rs | 144 +++++++++++++----- module/core/former/tests/inc/mod.rs | 4 +- module/core/former_meta/src/derive/former.rs | 4 +- 4 files changed, 115 insertions(+), 40 deletions(-) diff --git a/module/core/former/tests/inc/former_tests/a_containers_with_subformer_2_manual.rs b/module/core/former/tests/inc/former_tests/a_containers_with_subformer_2_manual.rs index bd65a36594..b080a71ca2 100644 --- a/module/core/former/tests/inc/former_tests/a_containers_with_subformer_2_manual.rs +++ b/module/core/former/tests/inc/former_tests/a_containers_with_subformer_2_manual.rs @@ -157,8 +157,7 @@ where } #[ inline( always ) ] - pub fn __vec_1< Former2 >( self ) -> - Former2 + pub fn __vec_1< Former2 >( self ) -> Former2 where Former2 : former::FormerBegin < diff --git a/module/core/former/tests/inc/former_tests/a_containers_with_subformer_manual.rs b/module/core/former/tests/inc/former_tests/a_containers_with_subformer_manual.rs index bb6cb149c3..699ef902b5 100644 --- a/module/core/former/tests/inc/former_tests/a_containers_with_subformer_manual.rs +++ b/module/core/former/tests/inc/former_tests/a_containers_with_subformer_manual.rs @@ -331,46 +331,92 @@ where // the_module::VectorSubformer::begin( formed, Some( self ), on_end ) // } - pub fn vec_1( self ) -> - former::VectorSubformer::< String, (), Vec< String >, former::ReturnStorage > - // former::VectorSubformer + #[ inline( always ) ] + pub fn vec_1_set< Former2 >( self ) -> Former2 + where + Former2 : former::FormerBegin + < + former::VectorDefinition + < + String, + Self, + Self, + __Vec1End, + // impl former::FormingEnd::< former::VectorDefinition< String, Self, Self, former::NoEnd > >, + // former::FormingEndClosure< former::VectorDefinition< String, Self, Self, former::NoEnd > >, + > + >, + { + + // let on_end = | formed : Vec< String >, super_former : ::core::option::Option< Self > | -> Self + // { + // let mut super_former = super_former.unwrap(); + // if let Some( ref mut field ) = super_former.storage.vec_1 + // { + // former::ContainerAssign::assign( field, formed ); + // } + // else + // { + // super_former.storage.vec_1 = Some( formed ); + // } + // super_former + // }; + + // Definition : former::FormerDefinition, + // < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform, + // Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage >, + + Former2::_begin( None, Some( self ), __Vec1End ) + // Former2::_begin( None, Some( self ), on_end ) + // Former2::_begin( None, Some( self ), former::FormingEndClosure::new( on_end ) ) + } + + // pub fn vec_1( self ) -> + // former::VectorSubformer:: // < // String, - // Vec< String >, // Self, - // impl former::FormingEnd< Struct1FormerDefinitionTypes >, + // Self, + // former::FormingEndClosure< former::VectorDefinition< String, Self, Self, former::NoEnd > >, // > - { - self.__vec_1::< former::VectorSubformer::< _, _, _, _ > >() - } + // { + // self.vec_1_set::< former::VectorSubformer:: + // < + // String, + // Self, + // Self, + // former::FormingEndClosure< former::VectorDefinition< String, Self, Self, former::NoEnd > > >, + // >() + // } - #[ doc = "Subformer setter for the 'hashmap_strings_1' field." ] - #[ inline ] - pub fn hashmap_strings_1( mut self ) -> the_module::HashMapSubformer< String, String, std::collections::HashMap< String, String >, Self, impl Fn( std::collections::HashMap< String, String >, core::option::Option< Self > ) -> Self, > - { - let formed = self.storage.hashmap_strings_1.take(); - let on_end = | formed : std::collections::HashMap< String, String >, former : core::option::Option< Self > | -> Self - { - let mut former = former.unwrap(); - former.storage.hashmap_strings_1 = Some( formed ); - former - }; - the_module::HashMapSubformer::begin( formed, Some( self ), on_end ) - } +// #[ doc = "Subformer setter for the 'hashmap_strings_1' field." ] +// #[ inline ] +// pub fn hashmap_strings_1( mut self ) -> the_module::HashMapSubformer< String, String, std::collections::HashMap< String, String >, Self, impl Fn( std::collections::HashMap< String, String >, core::option::Option< Self > ) -> Self, > +// { +// let formed = self.storage.hashmap_strings_1.take(); +// let on_end = | formed : std::collections::HashMap< String, String >, former : core::option::Option< Self > | -> Self +// { +// let mut former = former.unwrap(); +// former.storage.hashmap_strings_1 = Some( formed ); +// former +// }; +// the_module::HashMapSubformer::begin( formed, Some( self ), on_end ) +// } +// +// #[ doc = "Subformer setter for the 'hashset_strings_1' field." ] +// #[ inline ] +// pub fn hashset_strings_1( mut self ) -> the_module::HashSetSubformer< String, std::collections::HashSet< String >, Self, impl Fn( std::collections::HashSet< String >, core::option::Option< Self > ) -> Self, > +// { +// let formed = self.storage.hashset_strings_1.take(); +// let on_end = | formed : std::collections::HashSet< String >, former : core::option::Option< Self > | -> Self +// { +// let mut former = former.unwrap(); +// former.storage.hashset_strings_1 = Some( formed ); +// former +// }; +// the_module::HashSetSubformer::begin( formed, Some( self ), on_end ) +// } - #[ doc = "Subformer setter for the 'hashset_strings_1' field." ] - #[ inline ] - pub fn hashset_strings_1( mut self ) -> the_module::HashSetSubformer< String, std::collections::HashSet< String >, Self, impl Fn( std::collections::HashSet< String >, core::option::Option< Self > ) -> Self, > - { - let formed = self.storage.hashset_strings_1.take(); - let on_end = | formed : std::collections::HashSet< String >, former : core::option::Option< Self > | -> Self - { - let mut former = former.unwrap(); - former.storage.hashset_strings_1 = Some( formed ); - former - }; - the_module::HashSetSubformer::begin( formed, Some( self ), on_end ) - } } impl< Definition > Struct1Former< Definition > @@ -385,6 +431,36 @@ where } } +struct __Vec1End; +#[ automatically_derived ] +impl< Definition > former::FormingEnd +< + former::VectorDefinition< String, Struct1Former< Definition >, Struct1Former< Definition >, former::NoEnd >, +> +for __Vec1End +where + Definition : former::FormerDefinition, + Definition::Types : former::FormerDefinitionTypes + < + Storage = Struct1FormerStorage + >, + // < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform, +{ + fn call( &self, storage : Vec< String >, super_former : Option< Struct1Former< Definition > > ) -> Struct1Former< Definition > + { + let mut super_former = super_former.unwrap(); + if let Some( ref mut field ) = super_former.storage.vec_1 + { + former::ContainerAssign::assign( field, storage ); + } + else + { + super_former.storage.vec_1 = Some( storage ); + } + super_former + } +} + // = end of generated // include!( "./only_test/containers_with_subformer.rs" ); diff --git a/module/core/former/tests/inc/mod.rs b/module/core/former/tests/inc/mod.rs index d9541ddf2c..0483e2a4eb 100644 --- a/module/core/former/tests/inc/mod.rs +++ b/module/core/former/tests/inc/mod.rs @@ -20,8 +20,8 @@ mod former_tests // mod a_primitives_expanded; mod a_primitives; mod a_containers_without_subformer; - // #[ cfg( not( feature = "no_std" ) ) ] - // mod a_containers_with_subformer_manual; + #[ cfg( not( feature = "no_std" ) ) ] + mod a_containers_with_subformer_manual; // #[ cfg( not( feature = "no_std" ) ) ] // mod a_containers_with_subformer ; diff --git a/module/core/former_meta/src/derive/former.rs b/module/core/former_meta/src/derive/former.rs index 938d9e28e6..1025c4c795 100644 --- a/module/core/former_meta/src/derive/former.rs +++ b/module/core/former_meta/src/derive/former.rs @@ -858,8 +858,8 @@ pub fn former( input : proc_macro::TokenStream ) -> Result< TokenStream > { where Definition : former::FormerDefinition, - < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform, Definition::Types : former::FormerDefinitionTypes< Storage = #former_storage #generics_ty >, + < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform, }; // zzz : write helper to fix bug with where let generics_of_former = generics::merge( &generics, &extra_generics ); @@ -1227,8 +1227,8 @@ pub fn former( input : proc_macro::TokenStream ) -> Result< TokenStream > impl< Definition > #former< Definition > where Definition : former::FormerDefinition, - < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform, Definition::Types : former::FormerDefinitionTypes< Storage = #former_storage #generics_ty, Formed = #struct_name #generics_ty >, + < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform, { pub fn preform( self ) -> < Definition::Types as former::FormerDefinitionTypes >::Formed