Skip to content

Commit c704a0b

Browse files
committed
ser: udt
1 parent 18109f6 commit c704a0b

File tree

1 file changed

+25
-5
lines changed

1 file changed

+25
-5
lines changed

scylla-rust-wrapper/src/value.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use scylla::{
66
value::{
77
BuiltinSerializationErrorKind, MapSerializationErrorKind, SerializeCql,
88
SetOrListSerializationErrorKind, TupleSerializationErrorKind,
9+
UdtSerializationErrorKind,
910
},
1011
writers::WrittenCellProof,
1112
CellWriter, SerializationError,
@@ -89,11 +90,7 @@ impl CassCqlValue {
8990
serialize_mapping(m.len(), m.iter().map(|p| (&p.0, &p.1)), writer)
9091
}
9192
CassCqlValue::Set(s) => serialize_sequence(s.len(), s.iter(), writer),
92-
CassCqlValue::UserDefinedType {
93-
keyspace,
94-
type_name,
95-
fields,
96-
} => todo!(),
93+
CassCqlValue::UserDefinedType { fields, .. } => serialize_udt(fields, writer),
9794
}
9895
}
9996
}
@@ -279,3 +276,26 @@ fn serialize_mapping<'t, 'b>(
279276
.finish()
280277
.map_err(|_| mk_ser_err_named(rust_name, BuiltinSerializationErrorKind::SizeOverflow))
281278
}
279+
280+
fn serialize_udt<'b>(
281+
values: &[(String, Option<CassCqlValue>)],
282+
writer: CellWriter<'b>,
283+
) -> Result<WrittenCellProof<'b>, SerializationError> {
284+
let mut builder = writer.into_value_builder();
285+
for (fname, fvalue) in values {
286+
let writer = builder.make_sub_writer();
287+
match fvalue {
288+
None => writer.set_null(),
289+
Some(v) => v.do_serialize(writer).map_err(|err| {
290+
mk_ser_err::<CassCqlValue>(UdtSerializationErrorKind::FieldSerializationFailed {
291+
field_name: fname.clone(),
292+
err,
293+
})
294+
})?,
295+
};
296+
}
297+
298+
builder
299+
.finish()
300+
.map_err(|_| mk_ser_err::<CassCqlValue>(BuiltinSerializationErrorKind::SizeOverflow))
301+
}

0 commit comments

Comments
 (0)