Skip to content

Commit 40134f9

Browse files
committed
ser: use rust builtin serialization for simple types
Previously, we would reimplement a serialization logic. It was a copy from rust driver, with the typechecks excluded. In this commit, we get rid of the repeated code. To skip the typechecks (or rather, to make the typechecks always pass), we simply provide a valid ColumnType to SerializeValue::serialize(). This is a kind of hack, but thanks to that we don't have to reimplement serialization logic.
1 parent 3989ab2 commit 40134f9

File tree

1 file changed

+44
-73
lines changed

1 file changed

+44
-73
lines changed

scylla-rust-wrapper/src/value.rs

Lines changed: 44 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,50 @@ impl CassCqlValue {
7373
writer: CellWriter<'b>,
7474
) -> Result<WrittenCellProof<'b>, SerializationError> {
7575
match self {
76-
CassCqlValue::TinyInt(v) => serialize_i8(v, writer),
77-
CassCqlValue::SmallInt(v) => serialize_i16(v, writer),
78-
CassCqlValue::Int(v) => serialize_i32(v, writer),
79-
CassCqlValue::BigInt(v) => serialize_i64(v, writer),
80-
CassCqlValue::Float(v) => serialize_f32(v, writer),
81-
CassCqlValue::Double(v) => serialize_f64(v, writer),
82-
CassCqlValue::Boolean(v) => serialize_bool(v, writer),
83-
CassCqlValue::Text(v) => serialize_text(v, writer),
84-
CassCqlValue::Blob(v) => serialize_blob(v, writer),
85-
CassCqlValue::Uuid(v) => serialize_uuid(v, writer),
86-
CassCqlValue::Date(v) => serialize_date(v, writer),
87-
CassCqlValue::Inet(v) => serialize_inet(v, writer),
76+
// Notice:
77+
// We make use of builtin rust-driver serialization for simple types.
78+
// Keep in mind, that rust's implementation includes typechecks.
79+
//
80+
// We don't want to perform the typechecks here, because we handle it
81+
// earlier, during binding.
82+
// This is why, we make use of a hack, and provide a valid (in rust-driver's ser implementation)
83+
// ColumnType for each variant. This way, we can make sure that rust-driver's typecheck
84+
// will never fail. Thanks to that, we do not have to reimplement low-level serialization
85+
// for each type.
86+
CassCqlValue::TinyInt(v) => {
87+
<i8 as SerializeCql>::serialize(v, &ColumnType::TinyInt, writer)
88+
}
89+
CassCqlValue::SmallInt(v) => {
90+
<i16 as SerializeCql>::serialize(v, &ColumnType::SmallInt, writer)
91+
}
92+
CassCqlValue::Int(v) => <i32 as SerializeCql>::serialize(v, &ColumnType::Int, writer),
93+
CassCqlValue::BigInt(v) => {
94+
<i64 as SerializeCql>::serialize(v, &ColumnType::BigInt, writer)
95+
}
96+
CassCqlValue::Float(v) => {
97+
<f32 as SerializeCql>::serialize(v, &ColumnType::Float, writer)
98+
}
99+
CassCqlValue::Double(v) => {
100+
<f64 as SerializeCql>::serialize(v, &ColumnType::Double, writer)
101+
}
102+
CassCqlValue::Boolean(v) => {
103+
<bool as SerializeCql>::serialize(v, &ColumnType::Boolean, writer)
104+
}
105+
CassCqlValue::Text(v) => {
106+
<String as SerializeCql>::serialize(v, &ColumnType::Text, writer)
107+
}
108+
CassCqlValue::Blob(v) => {
109+
<Vec<u8> as SerializeCql>::serialize(v, &ColumnType::Blob, writer)
110+
}
111+
CassCqlValue::Uuid(v) => {
112+
<Uuid as SerializeCql>::serialize(v, &ColumnType::Uuid, writer)
113+
}
114+
CassCqlValue::Date(v) => {
115+
<CqlDate as SerializeCql>::serialize(v, &ColumnType::Date, writer)
116+
}
117+
CassCqlValue::Inet(v) => {
118+
<IpAddr as SerializeCql>::serialize(v, &ColumnType::Inet, writer)
119+
}
88120
CassCqlValue::Tuple(fields) => serialize_tuple_like(fields.iter(), writer),
89121
CassCqlValue::List(l) => serialize_sequence(l.len(), l.iter(), writer),
90122
CassCqlValue::Map(m) => {
@@ -132,67 +164,6 @@ fn mk_ser_err_named(
132164
})
133165
}
134166

135-
/// Generates a function that serializes a value of given type.
136-
macro_rules! fn_serialize_via_writer {
137-
($ser_fn:ident,
138-
$rust_typ:tt$(<$($targ:tt),+>)?,
139-
|$ser_me:ident, $writer:ident| $ser:expr) => {
140-
fn $ser_fn<'b>(
141-
v: &$rust_typ$(<$($targ),+>)?,
142-
writer: CellWriter<'b>,
143-
) -> Result<WrittenCellProof<'b>, SerializationError> {
144-
let $writer = writer;
145-
let $ser_me = v;
146-
let proof = $ser;
147-
Ok(proof)
148-
}
149-
};
150-
}
151-
152-
fn_serialize_via_writer!(serialize_i8, i8, |me, writer| {
153-
writer.set_value(me.to_be_bytes().as_slice()).unwrap()
154-
});
155-
fn_serialize_via_writer!(serialize_i16, i16, |me, writer| {
156-
writer.set_value(me.to_be_bytes().as_slice()).unwrap()
157-
});
158-
fn_serialize_via_writer!(serialize_i32, i32, |me, writer| {
159-
writer.set_value(me.to_be_bytes().as_slice()).unwrap()
160-
});
161-
fn_serialize_via_writer!(serialize_i64, i64, |me, writer| {
162-
writer.set_value(me.to_be_bytes().as_slice()).unwrap()
163-
});
164-
fn_serialize_via_writer!(serialize_f32, f32, |me, writer| {
165-
writer.set_value(me.to_be_bytes().as_slice()).unwrap()
166-
});
167-
fn_serialize_via_writer!(serialize_f64, f64, |me, writer| {
168-
writer.set_value(me.to_be_bytes().as_slice()).unwrap()
169-
});
170-
fn_serialize_via_writer!(serialize_bool, bool, |me, writer| {
171-
writer.set_value(&[*me as u8]).unwrap()
172-
});
173-
fn_serialize_via_writer!(serialize_text, String, |me, writer| {
174-
writer
175-
.set_value(me.as_bytes())
176-
.map_err(|_| mk_ser_err::<String>(BuiltinSerializationErrorKind::SizeOverflow))?
177-
});
178-
fn_serialize_via_writer!(serialize_blob, Vec<u8>, |me, writer| {
179-
writer
180-
.set_value(me.as_ref())
181-
.map_err(|_| mk_ser_err::<Vec<u8>>(BuiltinSerializationErrorKind::SizeOverflow))?
182-
});
183-
fn_serialize_via_writer!(serialize_uuid, Uuid, |me, writer| {
184-
writer.set_value(me.as_bytes().as_ref()).unwrap()
185-
});
186-
fn_serialize_via_writer!(serialize_date, CqlDate, |me, writer| {
187-
writer.set_value(me.0.to_be_bytes().as_slice()).unwrap()
188-
});
189-
fn_serialize_via_writer!(serialize_inet, IpAddr, |me, writer| {
190-
match me {
191-
IpAddr::V4(ip) => writer.set_value(&ip.octets()).unwrap(),
192-
IpAddr::V6(ip) => writer.set_value(&ip.octets()).unwrap(),
193-
}
194-
});
195-
196167
fn serialize_tuple_like<'t, 'b>(
197168
field_values: impl Iterator<Item = &'t Option<CassCqlValue>>,
198169
writer: CellWriter<'b>,

0 commit comments

Comments
 (0)