Skip to content

Commit c7bb334

Browse files
authored
Merge pull request #152 from muzarski/rust_ser_for_simple_types
ser: use rust-driver's builtin serialization for simple types
2 parents 0ac46a0 + 40134f9 commit c7bb334

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)