@@ -175,8 +175,64 @@ impl<'a> FromSql<'a> for uuid::Uuid {
175
175
}
176
176
}
177
177
178
+ // macro_rules! from_sql_vec_impl {
179
+ // ( $( $t:ty: $k:pat => $f:expr ),* ) => {
180
+ // $(
181
+ // impl<'a> FromSql<'a> for Vec<$t> {
182
+ // fn from_sql(value: ValueRef<'a>) -> FromSqlResult<Self> {
183
+ // match value {
184
+ // ValueRef::Array($k, vs) => {
185
+ // let f: fn(ValueRef<'a>) -> FromSqlResult<$t> = $f;
186
+ // let mut result = Vec::with_capacity(vs.len());
187
+ // for r in vs.iter() {
188
+ // let value: $t = f(r.clone())?;
189
+ // result.push(value);
190
+ // }
191
+ // Ok(result)
192
+ // }
193
+ // _ => {
194
+ // let from = SqlType::from(value.clone()).to_string();
195
+ // Err(Error::FromSql(FromSqlError::InvalidType {
196
+ // src: from,
197
+ // dst: format!("Vec<{}>", stringify!($t)).into(),
198
+ // }))
199
+ // }
200
+ // }
201
+ // }
202
+ // }
203
+ // )*
204
+ // // New implementation for nested Vec<Vec<T>>
205
+ // $(
206
+ // impl<'a> FromSql<'a> for Vec<Vec<$t>> {
207
+ // fn from_sql(value: ValueRef<'a>) -> FromSqlResult<Self> {
208
+ // match value {
209
+ // ValueRef::Array(SqlType::Array(_), outer_vs) => {
210
+ // outer_vs.iter().map(|outer_v| match outer_v {
211
+ // ValueRef::Array($k, inner_vs) => {
212
+ // let f: fn(ValueRef<'a>) -> FromSqlResult<$t> = $f;
213
+ // inner_vs.iter().map(|inner_v| f(inner_v.clone())).collect()
214
+ // },
215
+ // _ => Err(Error::FromSql(FromSqlError::InvalidType {
216
+ // src: SqlType::from(outer_v.clone()).to_string(),
217
+ // dst: format!("Vec<Vec<{}>>", stringify!($t)).into(),
218
+ // })),
219
+ // }).collect()
220
+ // },
221
+ // _ => Err(Error::FromSql(FromSqlError::InvalidType {
222
+ // src: SqlType::from(value.clone()).to_string(),
223
+ // dst: "Vec<Vec<_>>".into(),
224
+ // })),
225
+ // }
226
+ // }
227
+ // }
228
+ // )*
229
+
230
+ // };
231
+ // }
178
232
macro_rules! from_sql_vec_impl {
179
- ( $( $t: ty: $k: pat => $f: expr ) ,* ) => {
233
+ (
234
+ $( $t: ty: $k: pat => $f: expr) ,*
235
+ ) => {
180
236
$(
181
237
impl <' a> FromSql <' a> for Vec <$t> {
182
238
fn from_sql( value: ValueRef <' a>) -> FromSqlResult <Self > {
@@ -200,33 +256,37 @@ macro_rules! from_sql_vec_impl {
200
256
}
201
257
}
202
258
}
203
- ) *
204
- // New implementation for nested Vec<Vec<T>>
205
- $(
259
+
206
260
impl <' a> FromSql <' a> for Vec <Vec <$t>> {
207
261
fn from_sql( value: ValueRef <' a>) -> FromSqlResult <Self > {
208
262
match value {
209
263
ValueRef :: Array ( SqlType :: Array ( _) , outer_vs) => {
210
- outer_vs. iter( ) . map( |outer_v| match outer_v {
211
- ValueRef :: Array ( $k, inner_vs) => {
212
- let f: fn ( ValueRef <' a>) -> FromSqlResult <$t> = $f;
213
- inner_vs. iter( ) . map( |inner_v| f( inner_v. clone( ) ) ) . collect( )
214
- } ,
215
- _ => Err ( Error :: FromSql ( FromSqlError :: InvalidType {
216
- src: SqlType :: from( outer_v. clone( ) ) . to_string( ) ,
217
- dst: format!( "Vec<Vec<{}>>" , stringify!( $t) ) . into( ) ,
218
- } ) ) ,
219
- } ) . collect( )
220
- } ,
264
+ let mut result = Vec :: with_capacity( outer_vs. len( ) ) ;
265
+ for outer_v in outer_vs. iter( ) {
266
+ match outer_v {
267
+ ValueRef :: Array ( $k, inner_vs) => {
268
+ let f: fn ( ValueRef <' a>) -> FromSqlResult <$t> = $f;
269
+ let inner: Vec <$t> = inner_vs. iter( ) . map( |inner_v| f( inner_v. clone( ) ) ) . collect:: <std:: result:: Result <Vec <$t>, _>>( ) ?;
270
+ result. push( inner) ;
271
+ }
272
+ _ => {
273
+ return Err ( Error :: FromSql ( FromSqlError :: InvalidType {
274
+ src: SqlType :: from( outer_v. clone( ) ) . to_string( ) ,
275
+ dst: format!( "Vec<Vec<{}>>" , stringify!( $t) ) . into( ) ,
276
+ } ) ) ;
277
+ }
278
+ }
279
+ }
280
+ Ok ( result)
281
+ }
221
282
_ => Err ( Error :: FromSql ( FromSqlError :: InvalidType {
222
283
src: SqlType :: from( value. clone( ) ) . to_string( ) ,
223
- dst: "Vec<Vec<_ >>" . into( ) ,
284
+ dst: format! ( "Vec<Vec<{} >>" , stringify! ( $t ) ) . into( ) ,
224
285
} ) ) ,
225
286
}
226
287
}
227
288
}
228
289
) *
229
-
230
290
} ;
231
291
}
232
292
0 commit comments