Skip to content

Commit 65e59dc

Browse files
committed
ser: list and set
1 parent bff2ae8 commit 65e59dc

File tree

1 file changed

+35
-4
lines changed

1 file changed

+35
-4
lines changed

scylla-rust-wrapper/src/value.rs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
use std::net::IpAddr;
1+
use std::{convert::TryInto, net::IpAddr};
22

33
use scylla::{
44
frame::{response::result::ColumnType, value::CqlDate},
55
serialize::{
6-
value::{BuiltinSerializationErrorKind, SerializeCql, TupleSerializationErrorKind},
6+
value::{
7+
BuiltinSerializationErrorKind, SerializeCql, SetOrListSerializationErrorKind,
8+
TupleSerializationErrorKind,
9+
},
710
writers::WrittenCellProof,
811
CellWriter, SerializationError,
912
},
@@ -81,9 +84,9 @@ impl CassCqlValue {
8184
CassCqlValue::Date(v) => serialize_date(v, writer),
8285
CassCqlValue::Inet(v) => serialize_inet(v, writer),
8386
CassCqlValue::Tuple(fields) => serialize_tuple_like(fields.iter(), writer),
84-
CassCqlValue::List(_) => todo!(),
87+
CassCqlValue::List(l) => serialize_sequence(l.len(), l.iter(), writer),
8588
CassCqlValue::Map(_) => todo!(),
86-
CassCqlValue::Set(_) => todo!(),
89+
CassCqlValue::Set(s) => serialize_sequence(s.len(), s.iter(), writer),
8790
CassCqlValue::UserDefinedType {
8891
keyspace,
8992
type_name,
@@ -212,3 +215,31 @@ fn serialize_tuple_like<'t, 'b>(
212215
.finish()
213216
.map_err(|_| mk_ser_err::<CassCqlValue>(BuiltinSerializationErrorKind::SizeOverflow))
214217
}
218+
219+
fn serialize_sequence<'t, 'b>(
220+
len: usize,
221+
iter: impl Iterator<Item = &'t CassCqlValue>,
222+
writer: CellWriter<'b>,
223+
) -> Result<WrittenCellProof<'b>, SerializationError> {
224+
let rust_name = std::any::type_name::<CassCqlValue>();
225+
226+
let mut builder = writer.into_value_builder();
227+
228+
let element_count: i32 = len.try_into().map_err(|_| {
229+
mk_ser_err_named(rust_name, SetOrListSerializationErrorKind::TooManyElements)
230+
})?;
231+
builder.append_bytes(&element_count.to_be_bytes());
232+
233+
for el in iter {
234+
el.do_serialize(builder.make_sub_writer()).map_err(|err| {
235+
mk_ser_err_named(
236+
rust_name,
237+
SetOrListSerializationErrorKind::ElementSerializationFailed(err),
238+
)
239+
})?;
240+
}
241+
242+
builder
243+
.finish()
244+
.map_err(|_| mk_ser_err_named(rust_name, BuiltinSerializationErrorKind::SizeOverflow))
245+
}

0 commit comments

Comments
 (0)