@@ -21,8 +21,8 @@ pub struct Member {
2121}
2222
2323impl Member {
24- pub fn serialize ( & self ) -> Result < Vec < Felt > , PrimitiveError > {
25- self . ty . serialize ( )
24+ pub fn serialize ( & self , legacy_storage : bool ) -> Result < Vec < Felt > , PrimitiveError > {
25+ self . ty . serialize ( legacy_storage )
2626 }
2727}
2828
@@ -139,52 +139,60 @@ impl Ty {
139139 }
140140 }
141141
142- pub fn serialize ( & self ) -> Result < Vec < Felt > , PrimitiveError > {
142+ pub fn serialize ( & self , legacy_storage : bool ) -> Result < Vec < Felt > , PrimitiveError > {
143143 let mut felts = vec ! [ ] ;
144144
145- fn serialize_inner ( ty : & Ty , felts : & mut Vec < Felt > ) -> Result < ( ) , PrimitiveError > {
145+ fn serialize_inner ( ty : & Ty , felts : & mut Vec < Felt > , legacy_storage : bool ) -> Result < ( ) , PrimitiveError > {
146146 match ty {
147147 Ty :: Primitive ( c) => {
148148 felts. extend ( c. serialize ( ) ?) ;
149149 }
150150 Ty :: Struct ( s) => {
151151 for child in & s. children {
152- serialize_inner ( & child. ty , felts) ?;
152+ serialize_inner ( & child. ty , felts, legacy_storage ) ?;
153153 }
154154 }
155155 Ty :: Enum ( e) => {
156- let option = e
157- . option
158- . map ( |v| Ok ( vec ! [ Felt :: from( v) ] ) )
159- . unwrap_or ( Err ( PrimitiveError :: MissingFieldElement ) ) ?;
160- felts. extend ( option) ;
161-
162- // TODO: we should increment `option` is the model does not use the legacy
163- // storage system. But is this `serialize` function still
164- // used ?
165-
166- for EnumOption { ty, .. } in & e. options {
167- serialize_inner ( ty, felts) ?;
156+ if let Some ( option) = e. option {
157+ // For new storage system, enum variant indices start from 1
158+ let serialized_option = if legacy_storage {
159+ option
160+ } else {
161+ option + 1
162+ } ;
163+ felts. push ( Felt :: from ( serialized_option) ) ;
164+
165+ // Only serialize the selected option
166+ if let Some ( selected_option) = e. options . get ( option as usize ) {
167+ serialize_inner ( & selected_option. ty , felts, legacy_storage) ?;
168+ }
169+ } else {
170+ // For uninitialized enum in new storage system, use 0
171+ if !legacy_storage {
172+ felts. push ( Felt :: from ( 0u8 ) ) ;
173+ } else {
174+ return Err ( PrimitiveError :: MissingFieldElement ) ;
175+ }
168176 }
169177 }
170178 Ty :: Tuple ( tys) => {
171179 for ty in tys {
172- serialize_inner ( ty, felts) ?;
180+ serialize_inner ( ty, felts, legacy_storage ) ?;
173181 }
174182 }
175183 Ty :: Array ( items_ty) => {
176184 let _ = serialize_inner (
177185 & Ty :: Primitive ( Primitive :: U32 ( Some ( items_ty. len ( ) . try_into ( ) . unwrap ( ) ) ) ) ,
178186 felts,
187+ legacy_storage,
179188 ) ;
180189 for item_ty in items_ty {
181- serialize_inner ( item_ty, felts) ?;
190+ serialize_inner ( item_ty, felts, legacy_storage ) ?;
182191 }
183192 }
184- Ty :: FixedSizeArray ( ( items_ty, size) ) => {
185- let item_ty = & items_ty[ 0 ] ;
186- for _ in 0 ..* size {
187- serialize_inner ( item_ty, felts) ?;
193+ Ty :: FixedSizeArray ( ( items_ty, _size) ) => {
194+ for elem in items_ty {
195+ serialize_inner ( elem, felts, legacy_storage) ?;
188196 }
189197 }
190198 Ty :: ByteArray ( bytes) => {
@@ -196,7 +204,7 @@ impl Ty {
196204 Ok ( ( ) )
197205 }
198206
199- serialize_inner ( self , & mut felts) ?;
207+ serialize_inner ( self , & mut felts, legacy_storage ) ?;
200208
201209 Ok ( felts)
202210 }
0 commit comments