Skip to content

Commit 779125d

Browse files
committed
feat(schema): support legacy & non legacy ser
1 parent f3e3aef commit 779125d

File tree

1 file changed

+32
-24
lines changed

1 file changed

+32
-24
lines changed

crates/dojo/types/src/schema.rs

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ pub struct Member {
2121
}
2222

2323
impl 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

Comments
 (0)