@@ -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
231240impl_serialize ! ( [ ] spacetimedb_primitives:: TableId , ( self , ser) => ser. serialize_u32( self . 0 ) ) ;
0 commit comments