Skip to content

Commit

Permalink
former : experimenting
Browse files Browse the repository at this point in the history
  • Loading branch information
Wandalen committed Apr 12, 2024
1 parent 08c74d8 commit 00b54af
Show file tree
Hide file tree
Showing 10 changed files with 133 additions and 87 deletions.
8 changes: 0 additions & 8 deletions module/core/former/src/axiomatic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -218,14 +218,6 @@ for FormingEndClosure< Definition >
pub trait FormerBegin< Definition : FormerDefinition >
{

/// * `End` - A trait bound marking the closure or handler invoked upon completing the subforming process. Implementers
/// of this trait (`End`) are tasked with applying the final transformations that transition `Storage`
/// into `Formed`, optionally utilizing `Context` to guide this transformation. It is crucial that this
/// associated type satisfies the `FormingEnd< Formed >` trait, defining the precise mechanics of
/// how the subformer concludes its operation.
// type End : FormingEnd< Definition >;
// type End : Definition::End;

/// Launches the subforming process with an initial storage and context, setting up an `on_end` completion handler.
///
/// # Parameters
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,14 +177,10 @@ for Struct1FormerStorage

// = former

pub struct Struct1Former
<
Definition = Struct1FormerDefinition,
>
pub struct Struct1Former< Definition = Struct1FormerDefinition >
where
Definition : former::FormerDefinition,
Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage >,
// < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform,
{
storage : < Definition::Types as former::FormerDefinitionTypes >::Storage,
context : core::option::Option< < Definition::Types as former::FormerDefinitionTypes >::Context >,
Expand All @@ -195,7 +191,6 @@ impl< Definition > Struct1Former< Definition >
where
Definition : former::FormerDefinition,
Definition::Types : former::FormerDefinitionTypes< Storage = Struct1FormerStorage >,
// < Definition::Types as former::FormerDefinitionTypes >::Storage : former::StoragePreform,
{

#[ inline( always ) ]
Expand Down
10 changes: 8 additions & 2 deletions module/core/former/tests/inc/former_tests/attribute_setter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,15 @@ pub struct StructWithCustomSetters
magic : String,
}

impl< Context, End > StructWithCustomSettersFormer< Context, End >
// impl< Context, End > StructWithCustomSettersFormer< Context, End >
// where
// End: the_module::FormingEnd< StructWithCustomSetters, Context >,
// {

impl< Definition > StructWithCustomSettersFormer< Definition >
where
End: the_module::FormingEnd< StructWithCustomSetters, Context >,
Definition : former::FormerDefinition,
Definition::Types : former::FormerDefinitionTypes< Storage = StructWithCustomSettersFormerStorage >,
{

/// Custom alternative setter of ordinary field.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ impl< Name > Property< Name >
pub struct Command< K : core::hash::Hash + std::cmp::Eq >
{
pub name : String,
#[ subformer( the_module::HashMapSubformer ) ]
// #[ subformer( the_module::HashMapSubformer ) ]
#[ subformer( former::HashMapDefinition ) ]
pub properties : collection_tools::HashMap< K, Property< K > >,
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ where
K : core::hash::Hash + std::cmp::Eq,
{
pub name : String,
#[ subformer( the_module::HashMapSubformer ) ]
// #[ subformer( the_module::HashMapSubformer ) ]
#[ subformer( former::HashMapDefinition ) ]
pub properties : collection_tools::HashMap< K, Property< K > >,
}

Expand Down
3 changes: 2 additions & 1 deletion module/core/former/tests/inc/former_tests/subformer_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ where
{
pub name : String,
pub subject : String,
#[ subformer( the_module::HashMapSubformer ) ]
// #[ subformer( the_module::HashMapSubformer ) ]
#[ subformer( former::HashMapDefinition ) ]
pub properties : collection_tools::HashMap< K, Property< K > >,
}

Expand Down
175 changes: 112 additions & 63 deletions module/core/former/tests/inc/former_tests/subformer_shortcut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use super::*;

/// Parameter description.
#[ derive( Debug, Default, PartialEq, the_module::Former ) ]
pub struct TemplateParameterDefinition
pub struct TemplateParameterDescriptor
{
descriptor : String,
is_mandatory : bool,
Expand All @@ -15,8 +15,9 @@ pub struct TemplateParameterDefinition
pub struct TemplateParameters
{
// #[ debug = the_module::VectorSubformer, descriptor, descriptor( name ) ]
#[ subformer( the_module::VectorSubformer ) ]
descriptors : Vec< TemplateParameterDefinition >,
// #[ subformer( the_module::VectorSubformer ) ]
#[ subformer( former::VectorDefinition ) ]
descriptors : Vec< TemplateParameterDescriptor >,

// #[ subformer_setter = the_module::VectorSubformer ]
// pub fn descriptor( self, name : &str )
Expand All @@ -26,19 +27,35 @@ pub struct TemplateParameters

}

impl< Context, End > former::FormerBegin< TemplateParameterDefinitionFormerStorage, TemplateParameterDefinition, Context >
for TemplateParameterDefinitionFormer< Context, End >
// impl< Definition > TemplateParametersFormer< Definition >
// where
// Definition : former::FormerDefinition,
// Definition::Types : former::FormerDefinitionTypes< Storage = TemplateParameterDescriptorFormerStorage >,
// {

// impl< Context, End > former::FormerBegin< TemplateParameterDescriptorFormerStorage, TemplateParameterDescriptor, Context >
// for TemplateParameterDescriptorFormer< Context, End >
// where
// End : the_module::FormingEnd< TemplateParameterDescriptor, Context >,
impl< Definition > former::FormerBegin< Definition >
for TemplateParameterDescriptorFormer< Definition >
where
End : the_module::FormingEnd< TemplateParameterDefinition, Context >,
Definition : former::FormerDefinition,
Definition::Types : former::FormerDefinitionTypes< Storage = TemplateParameterDescriptorFormerStorage >,
// End : the_module::FormingEnd< TemplateParameterDescriptor, Context >,
{
type End = End;

// type End = End;

#[ inline( always ) ]
fn _begin
(
storage : core::option::Option< TemplateParameterDefinitionFormerStorage >,
context : core::option::Option< Context >,
on_end : End,
// storage : core::option::Option< TemplateParameterDescriptorFormerStorage >,
// context : core::option::Option< Context >,
// on_end : End,
storage : core::option::Option< < Definition::Types as former::FormerDefinitionTypes >::Storage >,
context : core::option::Option< < Definition::Types as former::FormerDefinitionTypes >::Context >,
on_end : Definition::End,
) -> Self
{
debug_assert!( storage.is_none() );
Expand All @@ -47,68 +64,100 @@ where

}

impl< Context, End > TemplateParametersFormer< Context, End >
// impl< Context, End > TemplateParametersFormer< Context, End >
// where
// End : former::FormingEnd< TemplateParameters, Context >,
impl< Definition > TemplateParametersFormer< Definition >
where
End : former::FormingEnd< TemplateParameters, Context >,
// End : former::FormingEnd< TemplateParameters, Context >,
Definition : former::FormerDefinition,
Definition::Types : former::FormerDefinitionTypes< Storage = TemplateParametersFormerStorage >,
{

// pub trait FormerDefinitionTypes : Sized
// {
// type Storage : Default;
// type Formed;
// type Context;
// }

#[ inline( always ) ]
pub fn descriptor3< Former2 >( self ) ->
pub fn descriptor3< Former2, Definition2, End >( self ) ->
Former2
where
Former2 : former::FormerBegin
<
TemplateParameterDefinitionFormerStorage,
TemplateParameterDefinition,
Self,
End = former::FormingEndClosure< TemplateParameterDefinition, Self >,
>,
// FieldContainer : ContainerAdd,
{
let on_end = | descriptor : TemplateParameterDefinition, super_former : core::option::Option< Self > | -> Self
{
let mut super_former = super_former.unwrap();
if super_former.storage.descriptors.is_none()
{
super_former.storage.descriptors = Some( Default::default() );
}
if let Some( ref mut descriptors ) = super_former.storage.descriptors
{
former::ContainerAdd::add( descriptors, descriptor );
}
super_former
};
Former2::_begin( None, Some( self ), former::FormingEndClosure::new( on_end ) )
}
// Definition2 : former::FormerDefinition< End = former::FormingEndClosure< Definition2::Types > >,
Definition2 : former::FormerDefinition,
Definition2::End : former::FormingEnd< Definition2::Types >,

// Definition2 : former::FormerDefinition< Types = Former2::Types, End = End >,
// Former2 : former::FormerBegin< Definition2 >,
// End : former::FormingEnd< Former2::Types >,

// xxx : uncomment
// Definition2::Types : former::FormerDefinitionTypes
// <
// Storage = TemplateParameterDescriptorFormerStorage,
// Formed = TemplateParameterDescriptor,
// Context = Self,
// >,
// Former2 : former::FormerBegin
// <
// Definition2,
// // TemplateParameterDescriptorFormerStorage,
// // TemplateParameterDescriptor,
// // Self,
// // End = former::FormingEndClosure< TemplateParameterDescriptor, Self >,
// >,
// // FieldContainer : ContainerAdd,
// {
//
// let on_end = | descriptor : TemplateParameterDescriptor, super_former : core::option::Option< Self > | -> Self
// {
// let mut super_former = super_former.unwrap();
// if super_former.storage.descriptors.is_none()
// {
// super_former.storage.descriptors = Some( Default::default() );
// }
// if let Some( ref mut descriptors ) = super_former.storage.descriptors
// {
// former::ContainerAdd::add( descriptors, descriptor );
// }
// super_former
// };
// Former2::_begin( None, Some( self ), former::FormingEndClosure::new( on_end ) )
// }

// xxx2 : move to a trait and make easier to use subformer, trait with generic interface of a container should help

#[ inline( always ) ]
pub fn descriptor( self, name : &str ) ->
TemplateParameterDefinitionFormer< Self, impl former::FormingEnd< TemplateParameterDefinition, Self > >
{
self.descriptor3::< TemplateParameterDefinitionFormer< _, _ > >().descriptor( name )
}
// xxx : uncomment
// #[ inline( always ) ]
// pub fn descriptor( self, name : &str ) ->
// // TemplateParameterDescriptorFormer< Self, impl former::FormingEnd< TemplateParameterDescriptor, Self > >
// TemplateParameterDescriptorFormer< Definition >
// {
// self.descriptor3::< TemplateParameterDescriptorFormer< _ > >().descriptor( name )
// }

}

#[ test ]
fn basic()
{

let got = TemplateParameters::former()
.descriptors()
.push( TemplateParameterDefinition::former().descriptor( "a" ).form() )
.push( TemplateParameterDefinition::former().descriptor( "b" ).form() )
.end()
.form();

let descriptors = vec!
[
TemplateParameterDefinition { descriptor : "a".to_string(), is_mandatory : false },
TemplateParameterDefinition { descriptor : "b".to_string(), is_mandatory : false },
];
let exp = TemplateParameters { descriptors };
a_id!( got, exp );

}
// xxx : uncomment
// #[ test ]
// fn basic()
// {
//
// let got = TemplateParameters::former()
// .descriptors()
// .push( TemplateParameterDescriptor::former().descriptor( "a" ).form() )
// .push( TemplateParameterDescriptor::former().descriptor( "b" ).form() )
// .end()
// .form();
//
// let descriptors = vec!
// [
// TemplateParameterDescriptor { descriptor : "a".to_string(), is_mandatory : false },
// TemplateParameterDescriptor { descriptor : "b".to_string(), is_mandatory : false },
// ];
// let exp = TemplateParameters { descriptors };
// a_id!( got, exp );
//
// }
8 changes: 4 additions & 4 deletions module/core/former/tests/inc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ mod former_tests
mod attribute_default_container;
mod attribute_default_primitive;
// mod attribute_perform;
// mod attribute_setter;
mod attribute_setter;
mod attribute_alias;

// mod string_slice_manual;
Expand Down Expand Up @@ -56,9 +56,9 @@ mod former_tests
// mod subformer_basic_manual;
// #[ cfg( any( not( feature = "no_std" ), feature = "use_alloc" ) ) ]
// mod subformer_basic;
//
// #[ cfg( any( not( feature = "no_std" ) ) ) ]
// mod subformer_shortcut;

#[ cfg( any( not( feature = "no_std" ) ) ) ]
mod subformer_shortcut;

// xxx : uncomment

Expand Down
2 changes: 1 addition & 1 deletion module/core/former_meta/src/derive/former.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1493,7 +1493,7 @@ pub fn former( input : proc_macro::TokenStream ) -> Result< TokenStream >
diag::debug_report_print( "derive : Former", original_input, &result );
}

// zzz : implement hints
// zzz : implement hints, rewrite
if example_of_custom_setter
{
let _example =
Expand Down
1 change: 1 addition & 0 deletions module/core/former_meta/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ mod derive
/// >
/// where
/// End : former::FormingEnd< UserProfile, Context >,
/// // zzz : update
/// {
/// storage : UserProfileFormerStorage,
/// context : Option< Context >,
Expand Down

0 comments on commit 00b54af

Please sign in to comment.