@@ -67,8 +67,10 @@ pub fn make_rx_impl(input: ReactiveStateDeriveInput) -> TokenStream {
67
67
// reactive `struct`s
68
68
let mut intermediate_fields = quote ! ( ) ;
69
69
let mut intermediate_field_makers = quote ! ( ) ;
70
+ let mut new_intermediate_field_makers = quote ! ( ) ;
70
71
let mut unrx_field_makers = quote ! ( ) ;
71
72
let mut suspense_commands = quote ! ( ) ;
73
+ let mut old_types = quote ! ( ) ;
72
74
for field in fields. iter ( ) {
73
75
let old_ty = field. ty . to_token_stream ( ) ;
74
76
let field_ident = field. ident . as_ref ( ) . unwrap ( ) ; // It's a `struct`, so this is defined
@@ -77,7 +79,10 @@ pub fn make_rx_impl(input: ReactiveStateDeriveInput) -> TokenStream {
77
79
for attr in field. attrs . iter ( ) {
78
80
field_attrs. extend ( attr. to_token_stream ( ) ) ;
79
81
}
80
-
82
+ // Old for ::new implementation of intermediate type
83
+ old_types. extend ( quote ! {
84
+ #field_ident: #old_ty,
85
+ } ) ;
81
86
// Nested fields are left as-is, non-nested ones are wrapped in `RcSignal`s
82
87
if field. nested {
83
88
// Nested types should implement the necessary linking traits
@@ -86,6 +91,7 @@ pub fn make_rx_impl(input: ReactiveStateDeriveInput) -> TokenStream {
86
91
#field_vis #field_ident: <#old_ty as :: perseus:: state:: MakeRx >:: Rx ,
87
92
} ) ;
88
93
intermediate_field_makers. extend ( quote ! { #field_ident: self . #field_ident. make_rx( ) , } ) ;
94
+ new_intermediate_field_makers. extend ( quote ! { #field_ident: #field_ident. make_rx( ) , } ) ;
89
95
unrx_field_makers
90
96
. extend ( quote ! { #field_ident: self . #field_ident. clone( ) . make_unrx( ) , } ) ;
91
97
@@ -118,6 +124,9 @@ pub fn make_rx_impl(input: ReactiveStateDeriveInput) -> TokenStream {
118
124
intermediate_field_makers. extend (
119
125
quote ! { #field_ident: :: sycamore:: prelude:: create_rc_signal( self . #field_ident) , } ,
120
126
) ;
127
+ new_intermediate_field_makers. extend (
128
+ quote ! { #field_ident: :: sycamore:: prelude:: create_rc_signal( #field_ident) , } ,
129
+ ) ;
121
130
// All fields must be `Clone`
122
131
unrx_field_makers
123
132
. extend ( quote ! { #field_ident: ( * self . #field_ident. get_untracked( ) ) . clone( ) , } ) ;
@@ -177,6 +186,36 @@ pub fn make_rx_impl(input: ReactiveStateDeriveInput) -> TokenStream {
177
186
#intermediate_fields
178
187
}
179
188
189
+ impl #intermediate_ident
190
+ {
191
+ fn new( #old_types) -> #intermediate_ident
192
+ {
193
+ use :: perseus:: state:: MakeRx ;
194
+ #intermediate_ident
195
+ {
196
+ #new_intermediate_field_makers
197
+ }
198
+ }
199
+ }
200
+
201
+ impl From <#intermediate_ident> for #ident
202
+ {
203
+ fn from( value: #intermediate_ident) -> #ident
204
+ {
205
+ use :: perseus:: state:: MakeUnrx ;
206
+ value. make_unrx( )
207
+ }
208
+ }
209
+
210
+ impl From <#ident> for #intermediate_ident
211
+ {
212
+ fn from( value: #ident) -> #intermediate_ident
213
+ {
214
+ use :: perseus:: state:: MakeRx ;
215
+ value. make_rx( )
216
+ }
217
+ }
218
+
180
219
impl :: perseus:: state:: MakeRx for #ident {
181
220
type Rx = #intermediate_ident;
182
221
fn make_rx( self ) -> Self :: Rx {
0 commit comments