@@ -6,6 +6,7 @@ use scylla::{
66 value:: {
77 BuiltinSerializationErrorKind , MapSerializationErrorKind , SerializeCql ,
88 SetOrListSerializationErrorKind , TupleSerializationErrorKind ,
9+ UdtSerializationErrorKind ,
910 } ,
1011 writers:: WrittenCellProof ,
1112 CellWriter , SerializationError ,
@@ -89,11 +90,7 @@ impl CassCqlValue {
8990 serialize_mapping ( m. len ( ) , m. iter ( ) . map ( |p| ( & p. 0 , & p. 1 ) ) , writer)
9091 }
9192 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) ,
9794 }
9895 }
9996}
@@ -279,3 +276,26 @@ fn serialize_mapping<'t, 'b>(
279276 . finish ( )
280277 . map_err ( |_| mk_ser_err_named ( rust_name, BuiltinSerializationErrorKind :: SizeOverflow ) )
281278}
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