Skip to content

Commit d7d080d

Browse files
authored
Deal wih AlgebraicType::Ref in Serialize for ValueWithType<ArrayValue> (#2708)
1 parent 41c316c commit d7d080d

1 file changed

Lines changed: 31 additions & 22 deletions

File tree

crates/sats/src/ser/impls.rs

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -204,28 +204,37 @@ impl_serialize!([] ValueWithType<'_, ProductValue>, (self, ser) => {
204204
}
205205
prod.end()
206206
});
207-
impl_serialize!([] ValueWithType<'_, ArrayValue>, (self, ser) => match (self.value(), &*self.ty().elem_ty) {
208-
(ArrayValue::Sum(v), AlgebraicType::Sum(ty)) => self.with(ty, v).serialize(ser),
209-
(ArrayValue::Product(v), AlgebraicType::Product(ty)) => self.with(ty, v).serialize(ser),
210-
(ArrayValue::Bool(v), AlgebraicType::Bool) => v.serialize(ser),
211-
(ArrayValue::I8(v), AlgebraicType::I8) => v.serialize(ser),
212-
(ArrayValue::U8(v), AlgebraicType::U8) => v.serialize(ser),
213-
(ArrayValue::I16(v), AlgebraicType::I16) => v.serialize(ser),
214-
(ArrayValue::U16(v), AlgebraicType::U16) => v.serialize(ser),
215-
(ArrayValue::I32(v), AlgebraicType::I32) => v.serialize(ser),
216-
(ArrayValue::U32(v), AlgebraicType::U32) => v.serialize(ser),
217-
(ArrayValue::I64(v), AlgebraicType::I64) => v.serialize(ser),
218-
(ArrayValue::U64(v), AlgebraicType::U64) => v.serialize(ser),
219-
(ArrayValue::I128(v), AlgebraicType::I128) => v.serialize(ser),
220-
(ArrayValue::U128(v), AlgebraicType::U128) => v.serialize(ser),
221-
(ArrayValue::I256(v), AlgebraicType::I256) => v.serialize(ser),
222-
(ArrayValue::U256(v), AlgebraicType::U256) => v.serialize(ser),
223-
(ArrayValue::F32(v), AlgebraicType::F32) => v.serialize(ser),
224-
(ArrayValue::F64(v), AlgebraicType::F64) => v.serialize(ser),
225-
(ArrayValue::String(v), AlgebraicType::String) => v.serialize(ser),
226-
(ArrayValue::Array(v), AlgebraicType::Array(ty)) => self.with(ty, v).serialize(ser),
227-
(val, _) if val.is_empty() => ser.serialize_array(0)?.end(),
228-
(val, ty) => panic!("mismatched value and schema: {val:?} {ty:?}"),
207+
impl_serialize!([] ValueWithType<'_, ArrayValue>, (self, ser) => {
208+
let mut ty = &*self.ty().elem_ty;
209+
loop { // We're doing this because of `Ref`s.
210+
break match (self.value(), ty) {
211+
(_, &AlgebraicType::Ref(r)) => {
212+
ty = &self.typespace()[r];
213+
continue;
214+
}
215+
(ArrayValue::Sum(v), AlgebraicType::Sum(ty)) => self.with(ty, v).serialize(ser),
216+
(ArrayValue::Product(v), AlgebraicType::Product(ty)) => self.with(ty, v).serialize(ser),
217+
(ArrayValue::Bool(v), AlgebraicType::Bool) => v.serialize(ser),
218+
(ArrayValue::I8(v), AlgebraicType::I8) => v.serialize(ser),
219+
(ArrayValue::U8(v), AlgebraicType::U8) => v.serialize(ser),
220+
(ArrayValue::I16(v), AlgebraicType::I16) => v.serialize(ser),
221+
(ArrayValue::U16(v), AlgebraicType::U16) => v.serialize(ser),
222+
(ArrayValue::I32(v), AlgebraicType::I32) => v.serialize(ser),
223+
(ArrayValue::U32(v), AlgebraicType::U32) => v.serialize(ser),
224+
(ArrayValue::I64(v), AlgebraicType::I64) => v.serialize(ser),
225+
(ArrayValue::U64(v), AlgebraicType::U64) => v.serialize(ser),
226+
(ArrayValue::I128(v), AlgebraicType::I128) => v.serialize(ser),
227+
(ArrayValue::U128(v), AlgebraicType::U128) => v.serialize(ser),
228+
(ArrayValue::I256(v), AlgebraicType::I256) => v.serialize(ser),
229+
(ArrayValue::U256(v), AlgebraicType::U256) => v.serialize(ser),
230+
(ArrayValue::F32(v), AlgebraicType::F32) => v.serialize(ser),
231+
(ArrayValue::F64(v), AlgebraicType::F64) => v.serialize(ser),
232+
(ArrayValue::String(v), AlgebraicType::String) => v.serialize(ser),
233+
(ArrayValue::Array(v), AlgebraicType::Array(ty)) => self.with(ty, v).serialize(ser),
234+
(val, _) if val.is_empty() => ser.serialize_array(0)?.end(),
235+
(val, ty) => panic!("mismatched value and schema: {val:?} {ty:?}"),
236+
}
237+
}
229238
});
230239

231240
impl_serialize!([] spacetimedb_primitives::TableId, (self, ser) => ser.serialize_u32(self.0));

0 commit comments

Comments
 (0)