@@ -4,8 +4,8 @@ use scylla::{
4
4
frame:: { response:: result:: ColumnType , value:: CqlDate } ,
5
5
serialize:: {
6
6
value:: {
7
- BuiltinSerializationErrorKind , SerializeCql , SetOrListSerializationErrorKind ,
8
- TupleSerializationErrorKind ,
7
+ BuiltinSerializationErrorKind , MapSerializationErrorKind , SerializeCql ,
8
+ SetOrListSerializationErrorKind , TupleSerializationErrorKind ,
9
9
} ,
10
10
writers:: WrittenCellProof ,
11
11
CellWriter , SerializationError ,
@@ -85,7 +85,9 @@ impl CassCqlValue {
85
85
CassCqlValue :: Inet ( v) => serialize_inet ( v, writer) ,
86
86
CassCqlValue :: Tuple ( fields) => serialize_tuple_like ( fields. iter ( ) , writer) ,
87
87
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
+ }
89
91
CassCqlValue :: Set ( s) => serialize_sequence ( s. len ( ) , s. iter ( ) , writer) ,
90
92
CassCqlValue :: UserDefinedType {
91
93
keyspace,
@@ -243,3 +245,37 @@ fn serialize_sequence<'t, 'b>(
243
245
. finish ( )
244
246
. map_err ( |_| mk_ser_err_named ( rust_name, BuiltinSerializationErrorKind :: SizeOverflow ) )
245
247
}
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