@@ -6,6 +6,7 @@ use scylla::{
6
6
value:: {
7
7
BuiltinSerializationErrorKind , MapSerializationErrorKind , SerializeCql ,
8
8
SetOrListSerializationErrorKind , TupleSerializationErrorKind ,
9
+ UdtSerializationErrorKind ,
9
10
} ,
10
11
writers:: WrittenCellProof ,
11
12
CellWriter , SerializationError ,
@@ -89,11 +90,7 @@ impl CassCqlValue {
89
90
serialize_mapping ( m. len ( ) , m. iter ( ) . map ( |p| ( & p. 0 , & p. 1 ) ) , writer)
90
91
}
91
92
CassCqlValue :: Set ( s) => serialize_sequence ( s. len ( ) , s. iter ( ) , writer) ,
92
- CassCqlValue :: UserDefinedType {
93
- keyspace,
94
- type_name,
95
- fields,
96
- } => todo ! ( ) ,
93
+ CassCqlValue :: UserDefinedType { fields, .. } => serialize_udt ( fields, writer) ,
97
94
}
98
95
}
99
96
}
@@ -279,3 +276,26 @@ fn serialize_mapping<'t, 'b>(
279
276
. finish ( )
280
277
. map_err ( |_| mk_ser_err_named ( rust_name, BuiltinSerializationErrorKind :: SizeOverflow ) )
281
278
}
279
+
280
+ fn serialize_udt < ' b > (
281
+ values : & [ ( String , Option < CassCqlValue > ) ] ,
282
+ writer : CellWriter < ' b > ,
283
+ ) -> Result < WrittenCellProof < ' b > , SerializationError > {
284
+ let mut builder = writer. into_value_builder ( ) ;
285
+ for ( fname, fvalue) in values {
286
+ let writer = builder. make_sub_writer ( ) ;
287
+ match fvalue {
288
+ None => writer. set_null ( ) ,
289
+ Some ( v) => v. do_serialize ( writer) . map_err ( |err| {
290
+ mk_ser_err :: < CassCqlValue > ( UdtSerializationErrorKind :: FieldSerializationFailed {
291
+ field_name : fname. clone ( ) ,
292
+ err,
293
+ } )
294
+ } ) ?,
295
+ } ;
296
+ }
297
+
298
+ builder
299
+ . finish ( )
300
+ . map_err ( |_| mk_ser_err :: < CassCqlValue > ( BuiltinSerializationErrorKind :: SizeOverflow ) )
301
+ }
0 commit comments