Skip to content

Commit 18109f6

Browse files
committed
ser: map
1 parent 65e59dc commit 18109f6

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

scylla-rust-wrapper/src/value.rs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use scylla::{
44
frame::{response::result::ColumnType, value::CqlDate},
55
serialize::{
66
value::{
7-
BuiltinSerializationErrorKind, SerializeCql, SetOrListSerializationErrorKind,
8-
TupleSerializationErrorKind,
7+
BuiltinSerializationErrorKind, MapSerializationErrorKind, SerializeCql,
8+
SetOrListSerializationErrorKind, TupleSerializationErrorKind,
99
},
1010
writers::WrittenCellProof,
1111
CellWriter, SerializationError,
@@ -85,7 +85,9 @@ impl CassCqlValue {
8585
CassCqlValue::Inet(v) => serialize_inet(v, writer),
8686
CassCqlValue::Tuple(fields) => serialize_tuple_like(fields.iter(), writer),
8787
CassCqlValue::List(l) => serialize_sequence(l.len(), l.iter(), writer),
88-
CassCqlValue::Map(_) => todo!(),
88+
CassCqlValue::Map(m) => {
89+
serialize_mapping(m.len(), m.iter().map(|p| (&p.0, &p.1)), writer)
90+
}
8991
CassCqlValue::Set(s) => serialize_sequence(s.len(), s.iter(), writer),
9092
CassCqlValue::UserDefinedType {
9193
keyspace,
@@ -243,3 +245,37 @@ fn serialize_sequence<'t, 'b>(
243245
.finish()
244246
.map_err(|_| mk_ser_err_named(rust_name, BuiltinSerializationErrorKind::SizeOverflow))
245247
}
248+
249+
fn serialize_mapping<'t, 'b>(
250+
len: usize,
251+
iter: impl Iterator<Item = (&'t CassCqlValue, &'t CassCqlValue)>,
252+
writer: CellWriter<'b>,
253+
) -> Result<WrittenCellProof<'b>, SerializationError> {
254+
let rust_name = std::any::type_name::<CassCqlValue>();
255+
256+
let mut builder = writer.into_value_builder();
257+
258+
let element_count: i32 = len
259+
.try_into()
260+
.map_err(|_| mk_ser_err_named(rust_name, MapSerializationErrorKind::TooManyElements))?;
261+
builder.append_bytes(&element_count.to_be_bytes());
262+
263+
for (k, v) in iter {
264+
k.do_serialize(builder.make_sub_writer()).map_err(|err| {
265+
mk_ser_err_named(
266+
rust_name,
267+
MapSerializationErrorKind::KeySerializationFailed(err),
268+
)
269+
})?;
270+
v.do_serialize(builder.make_sub_writer()).map_err(|err| {
271+
mk_ser_err_named(
272+
rust_name,
273+
MapSerializationErrorKind::ValueSerializationFailed(err),
274+
)
275+
})?;
276+
}
277+
278+
builder
279+
.finish()
280+
.map_err(|_| mk_ser_err_named(rust_name, BuiltinSerializationErrorKind::SizeOverflow))
281+
}

0 commit comments

Comments
 (0)