From c5f9e9333dd7b7be1d0c11907c32ce6a7a53c463 Mon Sep 17 00:00:00 2001 From: wandalen Date: Sat, 23 Mar 2024 16:52:12 +0200 Subject: [PATCH] former : experimenting --- .../inc/former_tests/a_primitives_expanded.rs | 145 +++++++----------- module/core/former_meta/src/derive/former.rs | 3 +- 2 files changed, 60 insertions(+), 88 deletions(-) diff --git a/module/core/former/tests/inc/former_tests/a_primitives_expanded.rs b/module/core/former/tests/inc/former_tests/a_primitives_expanded.rs index a31c9475cd..78c093d807 100644 --- a/module/core/former/tests/inc/former_tests/a_primitives_expanded.rs +++ b/module/core/former/tests/inc/former_tests/a_primitives_expanded.rs @@ -14,6 +14,7 @@ pub struct Struct1 // = formed +#[automatically_derived] impl Struct1 { #[doc = r""] @@ -26,9 +27,7 @@ impl Struct1 } } -// = descriptor - -#[ derive( Debug ) ] +#[derive(Debug)] pub struct Struct1FormerDescriptor; impl Struct1FormerDescriptor @@ -39,15 +38,13 @@ impl Struct1FormerDescriptor } } -impl former::FormerDescriptor -for Struct1FormerDescriptor +impl former::FormerDescriptor for Struct1FormerDescriptor { type Storage = Struct1FormerStorage; type Formed = Struct1; } -// = storage - +#[doc = "Container of a corresponding former."] pub struct Struct1FormerStorage { #[doc = r" A field"] @@ -75,115 +72,90 @@ impl ::core::default::Default for Struct1FormerStorage } } -impl former::Storage -for Struct1FormerStorage +impl former::Storage for Struct1FormerStorage { type Descriptor = Struct1FormerDescriptor; } -impl former::StoragePerform -for Struct1FormerStorage +impl former::StoragePerform for Struct1FormerStorage { - - fn preform( mut self ) -> Struct1 + fn preform(mut self) -> Struct1 { - - let int_1 = if self.int_1.is_some() - { - self.int_1.take().unwrap() - } - else - { - let val : i32 = Default::default(); - val - }; - - let string_1 = if self.string_1.is_some() - { - self.string_1.take().unwrap() - } - else - { - let val : String = Default::default(); - val - }; - - let int_optional_1 = if self.int_optional_1.is_some() - { - Some( self.int_optional_1.take().unwrap() ) - } - else - { - None - }; - - let string_optional_1 = if self.string_optional_1.is_some() - { - Some( self.string_optional_1.take().unwrap() ) - } - else - { - None - }; - - // xxx : Rust failt to use parameter here - // < < Self as former::Storage >::Descriptor as former::FormerDescriptor >::Formed Struct1 { - int_1, - string_1, - int_optional_1, - string_optional_1, + int_1 : self.int_1.take().or_else(|| Some(::core::marker::PhantomData::::maybe_default())).unwrap(), + string_1 : self.string_1.take().or_else(|| Some(::core::marker::PhantomData::::maybe_default())).unwrap(), + int_optional_1 : self.int_optional_1, + string_optional_1 : self.string_optional_1, } - } +} +trait MaybeDefault +{ + fn maybe_default() -> T; } -// = former +impl MaybeDefault for ::core::marker::PhantomData +where i32 : ::core::default::Default, +{ + fn maybe_default() -> i32 + { + i32::default() + } +} + +impl MaybeDefault for ::core::marker::PhantomData +where String : ::core::default::Default, +{ + fn maybe_default() -> String + { + String::default() + } +} +#[doc = +" Object to form [Struct1]. If field's values is not set then default value of the field is set.\n\nFor specifying custom default value use attribute `default`. For example:\n```\n\nuse former::Former;\n#[ derive( Former ) ]\npub struct Struct1\n{\n #[default( 31 ) ]\n field1 : i32,\n}\n\n```\n"] #[automatically_derived] -pub struct Struct1Former -where FormerEnd : former::FormingEnd, +pub struct Struct1Former<__FormerContext = Struct1, __FormerEnd = former::ReturnStorage> +where __FormerEnd : former::FormingEnd, { storage : Struct1FormerStorage, - context : core::option::Option, - on_end : core::option::Option, + context : core::option::Option<__FormerContext>, + on_end : core::option::Option<__FormerEnd>, } #[automatically_derived] -impl Struct1Former -where FormerEnd : former::FormingEnd, +impl<__FormerContext, __FormerEnd> Struct1Former<__FormerContext, __FormerEnd> +where __FormerEnd : former::FormingEnd, { #[doc = r""] #[doc = r" Finish setting options and return formed entity."] #[doc = r""] - #[doc = r" `perform` has no effect on method `form`, but change behavior and returned type of method `perform`."] - #[doc = r""] #[inline(always)] - pub fn preform(self) -> < Struct1FormerDescriptor as former::FormerDescriptor >::Formed + pub fn preform(self) -> ::Formed { - < Struct1FormerStorage as former::StoragePerform >::preform( self.storage ) + ::preform(self.storage) } #[doc = r""] #[doc = r" Finish setting options and call perform on formed entity."] #[doc = r""] - #[doc = r" If `perform` defined then associated method is called and its result returned instead of entity."] - #[doc = r" For example `perform()` of structure with : `#[ perform( fn after1() -> &str > )` returns `&str`."] + #[doc = r" If `perform` defined then associated method is called and its result returned instead of entity."] + #[doc = r" For example `perform()` of structure with : `#[ perform( fn after1() -> &str > )` returns `&str`."] #[doc = r""] #[inline(always)] - pub fn perform( self ) -> < Struct1FormerDescriptor as former::FormerDescriptor >::Formed + pub fn perform(self) -> ::Formed { let result = self.form(); return result; } #[doc = r""] - #[doc = r" Begin the process of forming. Expects context of forming to return it after forming."] + #[doc = r" Begin the process of forming. Expects context of forming to return it after forming."] #[doc = r""] #[inline(always)] - pub fn begin(mut storage : core::option::Option, context : core::option::Option, on_end : FormerEnd,) -> Self + pub fn begin(mut storage : core::option::Option, context : core::option::Option<__FormerContext>, on_end : __FormerEnd,) -> Self { if storage.is_none() { @@ -191,37 +163,36 @@ where FormerEnd : former::FormingEnd, } Self { - storage: storage.unwrap(), - context: context, - on_end: ::core::option::Option::Some(on_end), + storage : storage.unwrap(), + context : context, + on_end : ::core::option::Option::Some(on_end), } } #[doc = r""] - #[doc = r" End the process of forming returning original context of forming."] + #[doc = r" End the process of forming returning original context of forming."] #[doc = r""] #[inline(always)] - pub fn form( self ) -> < Struct1FormerDescriptor as former::FormerDescriptor >::Formed + pub fn form(self) -> ::Formed { self.end() } #[doc = r""] - #[doc = r" End the process of forming returning original context of forming."] + #[doc = r" End the process of forming returning original context of forming."] #[doc = r""] #[inline(always)] - pub fn end(mut self) -> < Struct1FormerDescriptor as former::FormerDescriptor >::Formed + pub fn end(mut self) -> ::Formed { let on_end = self.on_end.take().unwrap(); let context = self.context.take(); - // let storage = self.form(); on_end.call(self.storage, context) } #[doc = "Setter for the 'int_1' field."] #[inline] pub fn int_1(mut self, src: Src) -> Self - where Src: ::core::convert::Into, + where Src : ::core::convert::Into, { debug_assert!(self.storage.int_1.is_none()); self.storage.int_1 = ::core::option::Option::Some(src.into()); @@ -231,7 +202,7 @@ where FormerEnd : former::FormingEnd, #[doc = "Setter for the 'string_1' field."] #[inline] pub fn string_1(mut self, src: Src) -> Self - where Src: ::core::convert::Into, + where Src : ::core::convert::Into, { debug_assert!(self.storage.string_1.is_none()); self.storage.string_1 = ::core::option::Option::Some(src.into()); @@ -241,7 +212,7 @@ where FormerEnd : former::FormingEnd, #[doc = "Setter for the 'int_optional_1' field."] #[inline] pub fn int_optional_1(mut self, src: Src) -> Self - where Src: ::core::convert::Into, + where Src : ::core::convert::Into, { debug_assert!(self.storage.int_optional_1.is_none()); self.storage.int_optional_1 = ::core::option::Option::Some(src.into()); @@ -251,7 +222,7 @@ where FormerEnd : former::FormingEnd, #[doc = "Setter for the 'string_optional_1' field."] #[inline] pub fn string_optional_1(mut self, src: Src) -> Self - where Src: ::core::convert::Into, + where Src : ::core::convert::Into, { debug_assert!(self.storage.string_optional_1.is_none()); self.storage.string_optional_1 = ::core::option::Option::Some(src.into()); diff --git a/module/core/former_meta/src/derive/former.rs b/module/core/former_meta/src/derive/former.rs index 89411c17f1..6a7162a36e 100644 --- a/module/core/former_meta/src/derive/former.rs +++ b/module/core/former_meta/src/derive/former.rs @@ -1000,7 +1000,8 @@ pub fn former( input : proc_macro::TokenStream ) -> Result< TokenStream > #generics_where { - fn preform( mut self ) -> #former_storage_name_ident #generics_ty + // fn preform( mut self ) -> #former_storage_name_ident #generics_ty + fn preform( mut self ) -> < former_descriptor_name_ident #generics_ty as former::FormerDescriptor >::Formed { Self {