|
1 |
| -use std::net::IpAddr; |
| 1 | +use std::{convert::TryInto, net::IpAddr}; |
2 | 2 |
|
3 | 3 | use scylla::{
|
4 | 4 | frame::{response::result::ColumnType, value::CqlDate},
|
5 | 5 | serialize::{
|
6 |
| - value::{BuiltinSerializationErrorKind, SerializeCql, TupleSerializationErrorKind}, |
| 6 | + value::{ |
| 7 | + BuiltinSerializationErrorKind, SerializeCql, SetOrListSerializationErrorKind, |
| 8 | + TupleSerializationErrorKind, |
| 9 | + }, |
7 | 10 | writers::WrittenCellProof,
|
8 | 11 | CellWriter, SerializationError,
|
9 | 12 | },
|
@@ -81,9 +84,9 @@ impl CassCqlValue {
|
81 | 84 | CassCqlValue::Date(v) => serialize_date(v, writer),
|
82 | 85 | CassCqlValue::Inet(v) => serialize_inet(v, writer),
|
83 | 86 | CassCqlValue::Tuple(fields) => serialize_tuple_like(fields.iter(), writer),
|
84 |
| - CassCqlValue::List(_) => todo!(), |
| 87 | + CassCqlValue::List(l) => serialize_sequence(l.len(), l.iter(), writer), |
85 | 88 | CassCqlValue::Map(_) => todo!(),
|
86 |
| - CassCqlValue::Set(_) => todo!(), |
| 89 | + CassCqlValue::Set(s) => serialize_sequence(s.len(), s.iter(), writer), |
87 | 90 | CassCqlValue::UserDefinedType {
|
88 | 91 | keyspace,
|
89 | 92 | type_name,
|
@@ -212,3 +215,31 @@ fn serialize_tuple_like<'t, 'b>(
|
212 | 215 | .finish()
|
213 | 216 | .map_err(|_| mk_ser_err::<CassCqlValue>(BuiltinSerializationErrorKind::SizeOverflow))
|
214 | 217 | }
|
| 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