Skip to content

Commit bff2ae8

Browse files
committed
ser: Tuple
1 parent 11e35cb commit bff2ae8

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

scylla-rust-wrapper/src/value.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::net::IpAddr;
33
use 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

Comments
 (0)