@@ -4,8 +4,8 @@ use scylla::{
44 frame:: { response:: result:: ColumnType , value:: CqlDate } ,
55 serialize:: {
66 value:: {
7- BuiltinSerializationErrorKind , SerializeCql , SetOrListSerializationErrorKind ,
8- TupleSerializationErrorKind ,
7+ BuiltinSerializationErrorKind , MapSerializationErrorKind , SerializeCql ,
8+ SetOrListSerializationErrorKind , TupleSerializationErrorKind ,
99 } ,
1010 writers:: WrittenCellProof ,
1111 CellWriter , SerializationError ,
@@ -85,7 +85,9 @@ impl CassCqlValue {
8585 CassCqlValue :: Inet ( v) => serialize_inet ( v, writer) ,
8686 CassCqlValue :: Tuple ( fields) => serialize_tuple_like ( fields. iter ( ) , writer) ,
8787 CassCqlValue :: List ( l) => serialize_sequence ( l. len ( ) , l. iter ( ) , writer) ,
88- CassCqlValue :: Map ( _) => todo ! ( ) ,
88+ CassCqlValue :: Map ( m) => {
89+ serialize_mapping ( m. len ( ) , m. iter ( ) . map ( |p| ( & p. 0 , & p. 1 ) ) , writer)
90+ }
8991 CassCqlValue :: Set ( s) => serialize_sequence ( s. len ( ) , s. iter ( ) , writer) ,
9092 CassCqlValue :: UserDefinedType {
9193 keyspace,
@@ -243,3 +245,37 @@ fn serialize_sequence<'t, 'b>(
243245 . finish ( )
244246 . map_err ( |_| mk_ser_err_named ( rust_name, BuiltinSerializationErrorKind :: SizeOverflow ) )
245247}
248+
249+ fn serialize_mapping < ' t , ' b > (
250+ len : usize ,
251+ iter : impl Iterator < Item = ( & ' t CassCqlValue , & ' t CassCqlValue ) > ,
252+ writer : CellWriter < ' b > ,
253+ ) -> Result < WrittenCellProof < ' b > , SerializationError > {
254+ let rust_name = std:: any:: type_name :: < CassCqlValue > ( ) ;
255+
256+ let mut builder = writer. into_value_builder ( ) ;
257+
258+ let element_count: i32 = len
259+ . try_into ( )
260+ . map_err ( |_| mk_ser_err_named ( rust_name, MapSerializationErrorKind :: TooManyElements ) ) ?;
261+ builder. append_bytes ( & element_count. to_be_bytes ( ) ) ;
262+
263+ for ( k, v) in iter {
264+ k. do_serialize ( builder. make_sub_writer ( ) ) . map_err ( |err| {
265+ mk_ser_err_named (
266+ rust_name,
267+ MapSerializationErrorKind :: KeySerializationFailed ( err) ,
268+ )
269+ } ) ?;
270+ v. do_serialize ( builder. make_sub_writer ( ) ) . map_err ( |err| {
271+ mk_ser_err_named (
272+ rust_name,
273+ MapSerializationErrorKind :: ValueSerializationFailed ( err) ,
274+ )
275+ } ) ?;
276+ }
277+
278+ builder
279+ . finish ( )
280+ . map_err ( |_| mk_ser_err_named ( rust_name, BuiltinSerializationErrorKind :: SizeOverflow ) )
281+ }
0 commit comments