@@ -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- 
196167fn  serialize_tuple_like < ' t ,  ' b > ( 
197168    field_values :  impl  Iterator < Item  = & ' t  Option < CassCqlValue > > , 
198169    writer :  CellWriter < ' b > , 
0 commit comments