@@ -3,7 +3,7 @@ use std::net::IpAddr;
33use scylla:: {
44 frame:: { response:: result:: ColumnType , value:: CqlDate } ,
55 serialize:: {
6- value:: { BuiltinSerializationErrorKind , SerializeCql } ,
6+ value:: { BuiltinSerializationErrorKind , SerializeCql , TupleSerializationErrorKind } ,
77 writers:: WrittenCellProof ,
88 CellWriter , SerializationError ,
99 } ,
@@ -80,7 +80,7 @@ impl CassCqlValue {
8080 CassCqlValue :: Uuid ( v) => serialize_uuid ( v, writer) ,
8181 CassCqlValue :: Date ( v) => serialize_date ( v, writer) ,
8282 CassCqlValue :: Inet ( v) => serialize_inet ( v, writer) ,
83- CassCqlValue :: Tuple { .. } => todo ! ( ) ,
83+ CassCqlValue :: Tuple ( fields ) => serialize_tuple_like ( fields . iter ( ) , writer ) ,
8484 CassCqlValue :: List ( _) => todo ! ( ) ,
8585 CassCqlValue :: Map ( _) => todo ! ( ) ,
8686 CassCqlValue :: Set ( _) => todo ! ( ) ,
@@ -189,3 +189,26 @@ fn_serialize_via_writer!(serialize_inet, IpAddr, |me, writer| {
189189 IpAddr :: V6 ( ip) => writer. set_value( & ip. octets( ) ) . unwrap( ) ,
190190 }
191191} ) ;
192+
193+ fn serialize_tuple_like < ' t , ' b > (
194+ field_values : impl Iterator < Item = & ' t Option < CassCqlValue > > ,
195+ writer : CellWriter < ' b > ,
196+ ) -> Result < WrittenCellProof < ' b > , SerializationError > {
197+ let mut builder = writer. into_value_builder ( ) ;
198+
199+ for ( index, el) in field_values. enumerate ( ) {
200+ let sub = builder. make_sub_writer ( ) ;
201+ match el {
202+ None => sub. set_null ( ) ,
203+ Some ( el) => el. do_serialize ( sub) . map_err ( |err| {
204+ mk_ser_err :: < CassCqlValue > (
205+ TupleSerializationErrorKind :: ElementSerializationFailed { index, err } ,
206+ )
207+ } ) ?,
208+ } ;
209+ }
210+
211+ builder
212+ . finish ( )
213+ . map_err ( |_| mk_ser_err :: < CassCqlValue > ( BuiltinSerializationErrorKind :: SizeOverflow ) )
214+ }
0 commit comments