@@ -5,8 +5,9 @@ use scylla::{
55 serialize:: {
66 value:: {
77 BuiltinSerializationError , BuiltinSerializationErrorKind , BuiltinTypeCheckError ,
8- BuiltinTypeCheckErrorKind , SerializeCql , SetOrListSerializationErrorKind ,
9- SetOrListTypeCheckErrorKind , TupleSerializationErrorKind , TupleTypeCheckErrorKind ,
8+ BuiltinTypeCheckErrorKind , MapSerializationErrorKind , MapTypeCheckErrorKind ,
9+ SerializeCql , SetOrListSerializationErrorKind , SetOrListTypeCheckErrorKind ,
10+ TupleSerializationErrorKind , TupleTypeCheckErrorKind ,
1011 } ,
1112 writers:: WrittenCellProof ,
1213 CellWriter , SerializationError ,
@@ -99,7 +100,9 @@ impl SerializeCql for CassCqlValue {
99100 serialize_tuple_like ( typ, fields. iter ( ) , t. iter ( ) , writer)
100101 }
101102 CassCqlValue :: List ( l) => serialize_sequence ( l. len ( ) , l. iter ( ) , typ, writer) ,
102- CassCqlValue :: Map ( _) => todo ! ( ) ,
103+ CassCqlValue :: Map ( m) => {
104+ serialize_mapping ( m. len ( ) , m. iter ( ) . map ( |p| ( & p. 0 , & p. 1 ) ) , typ, writer)
105+ }
103106 CassCqlValue :: Set ( s) => serialize_sequence ( s. len ( ) , s. iter ( ) , typ, writer) ,
104107 CassCqlValue :: UserDefinedType {
105108 keyspace,
@@ -306,3 +309,51 @@ fn serialize_sequence<'t, 'b, T: SerializeCql + 't>(
306309 . finish ( )
307310 . map_err ( |_| mk_ser_err_named ( rust_name, typ, BuiltinSerializationErrorKind :: SizeOverflow ) )
308311}
312+
313+ fn serialize_mapping < ' t , ' b , K : SerializeCql + ' t , V : SerializeCql + ' t > (
314+ len : usize ,
315+ iter : impl Iterator < Item = ( & ' t K , & ' t V ) > ,
316+ typ : & ColumnType ,
317+ writer : CellWriter < ' b > ,
318+ ) -> Result < WrittenCellProof < ' b > , SerializationError > {
319+ let rust_name = std:: any:: type_name :: < CassCqlValue > ( ) ;
320+
321+ let ( ktyp, vtyp) = match typ {
322+ ColumnType :: Map ( k, v) => ( k, v) ,
323+ _ => {
324+ return Err ( mk_typck_err_named (
325+ rust_name,
326+ typ,
327+ MapTypeCheckErrorKind :: NotMap ,
328+ ) ) ;
329+ }
330+ } ;
331+
332+ let mut builder = writer. into_value_builder ( ) ;
333+
334+ let element_count: i32 = len. try_into ( ) . map_err ( |_| {
335+ mk_ser_err_named ( rust_name, typ, MapSerializationErrorKind :: TooManyElements )
336+ } ) ?;
337+ builder. append_bytes ( & element_count. to_be_bytes ( ) ) ;
338+
339+ for ( k, v) in iter {
340+ K :: serialize ( k, ktyp, builder. make_sub_writer ( ) ) . map_err ( |err| {
341+ mk_ser_err_named (
342+ rust_name,
343+ typ,
344+ MapSerializationErrorKind :: KeySerializationFailed ( err) ,
345+ )
346+ } ) ?;
347+ V :: serialize ( v, vtyp, builder. make_sub_writer ( ) ) . map_err ( |err| {
348+ mk_ser_err_named (
349+ rust_name,
350+ typ,
351+ MapSerializationErrorKind :: ValueSerializationFailed ( err) ,
352+ )
353+ } ) ?;
354+ }
355+
356+ builder
357+ . finish ( )
358+ . map_err ( |_| mk_ser_err_named ( rust_name, typ, BuiltinSerializationErrorKind :: SizeOverflow ) )
359+ }
0 commit comments