@@ -73,18 +73,50 @@ impl CassCqlValue {
73
73
writer : CellWriter < ' b > ,
74
74
) -> Result < WrittenCellProof < ' b > , SerializationError > {
75
75
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
+ }
88
120
CassCqlValue :: Tuple ( fields) => serialize_tuple_like ( fields. iter ( ) , writer) ,
89
121
CassCqlValue :: List ( l) => serialize_sequence ( l. len ( ) , l. iter ( ) , writer) ,
90
122
CassCqlValue :: Map ( m) => {
@@ -132,67 +164,6 @@ fn mk_ser_err_named(
132
164
} )
133
165
}
134
166
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
-
196
167
fn serialize_tuple_like < ' t , ' b > (
197
168
field_values : impl Iterator < Item = & ' t Option < CassCqlValue > > ,
198
169
writer : CellWriter < ' b > ,
0 commit comments