Skip to content

Commit 5a5cb5f

Browse files
committed
ser: map
1 parent 83af83b commit 5a5cb5f

File tree

1 file changed

+54
-3
lines changed

1 file changed

+54
-3
lines changed

scylla-rust-wrapper/src/value.rs

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ use scylla::{
55
serialize::{
66
value::{
77
BuiltinSerializationError, BuiltinSerializationErrorKind, BuiltinTypeCheckError,
8-
BuiltinTypeCheckErrorKind, SerializeCql, SetOrListSerializationErrorKind,
9-
SetOrListTypeCheckErrorKind, TupleSerializationErrorKind, TupleTypeCheckErrorKind,
8+
BuiltinTypeCheckErrorKind, MapSerializationErrorKind, MapTypeCheckErrorKind,
9+
SerializeCql, SetOrListSerializationErrorKind, SetOrListTypeCheckErrorKind,
10+
TupleSerializationErrorKind, TupleTypeCheckErrorKind,
1011
},
1112
writers::WrittenCellProof,
1213
CellWriter, SerializationError,
@@ -99,7 +100,9 @@ impl SerializeCql for CassCqlValue {
99100
serialize_tuple_like(typ, fields.iter(), t.iter(), writer)
100101
}
101102
CassCqlValue::List(l) => serialize_sequence(l.len(), l.iter(), typ, writer),
102-
CassCqlValue::Map(_) => todo!(),
103+
CassCqlValue::Map(m) => {
104+
serialize_mapping(m.len(), m.iter().map(|p| (&p.0, &p.1)), typ, writer)
105+
}
103106
CassCqlValue::Set(s) => serialize_sequence(s.len(), s.iter(), typ, writer),
104107
CassCqlValue::UserDefinedType {
105108
keyspace,
@@ -306,3 +309,51 @@ fn serialize_sequence<'t, 'b, T: SerializeCql + 't>(
306309
.finish()
307310
.map_err(|_| mk_ser_err_named(rust_name, typ, BuiltinSerializationErrorKind::SizeOverflow))
308311
}
312+
313+
fn serialize_mapping<'t, 'b, K: SerializeCql + 't, V: SerializeCql + 't>(
314+
len: usize,
315+
iter: impl Iterator<Item = (&'t K, &'t V)>,
316+
typ: &ColumnType,
317+
writer: CellWriter<'b>,
318+
) -> Result<WrittenCellProof<'b>, SerializationError> {
319+
let rust_name = std::any::type_name::<CassCqlValue>();
320+
321+
let (ktyp, vtyp) = match typ {
322+
ColumnType::Map(k, v) => (k, v),
323+
_ => {
324+
return Err(mk_typck_err_named(
325+
rust_name,
326+
typ,
327+
MapTypeCheckErrorKind::NotMap,
328+
));
329+
}
330+
};
331+
332+
let mut builder = writer.into_value_builder();
333+
334+
let element_count: i32 = len.try_into().map_err(|_| {
335+
mk_ser_err_named(rust_name, typ, MapSerializationErrorKind::TooManyElements)
336+
})?;
337+
builder.append_bytes(&element_count.to_be_bytes());
338+
339+
for (k, v) in iter {
340+
K::serialize(k, ktyp, builder.make_sub_writer()).map_err(|err| {
341+
mk_ser_err_named(
342+
rust_name,
343+
typ,
344+
MapSerializationErrorKind::KeySerializationFailed(err),
345+
)
346+
})?;
347+
V::serialize(v, vtyp, builder.make_sub_writer()).map_err(|err| {
348+
mk_ser_err_named(
349+
rust_name,
350+
typ,
351+
MapSerializationErrorKind::ValueSerializationFailed(err),
352+
)
353+
})?;
354+
}
355+
356+
builder
357+
.finish()
358+
.map_err(|_| mk_ser_err_named(rust_name, typ, BuiltinSerializationErrorKind::SizeOverflow))
359+
}

0 commit comments

Comments
 (0)