@@ -175,8 +175,64 @@ impl<'a> FromSql<'a> for uuid::Uuid {
175175 }
176176}
177177
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+ // }
178232macro_rules! from_sql_vec_impl {
179- ( $( $t: ty: $k: pat => $f: expr ) ,* ) => {
233+ (
234+ $( $t: ty: $k: pat => $f: expr) ,*
235+ ) => {
180236 $(
181237 impl <' a> FromSql <' a> for Vec <$t> {
182238 fn from_sql( value: ValueRef <' a>) -> FromSqlResult <Self > {
@@ -200,33 +256,37 @@ macro_rules! from_sql_vec_impl {
200256 }
201257 }
202258 }
203- ) *
204- // New implementation for nested Vec<Vec<T>>
205- $(
259+
206260 impl <' a> FromSql <' a> for Vec <Vec <$t>> {
207261 fn from_sql( value: ValueRef <' a>) -> FromSqlResult <Self > {
208262 match value {
209263 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+ }
221282 _ => Err ( Error :: FromSql ( FromSqlError :: InvalidType {
222283 src: SqlType :: from( value. clone( ) ) . to_string( ) ,
223- dst: "Vec<Vec<_ >>" . into( ) ,
284+ dst: format! ( "Vec<Vec<{} >>" , stringify! ( $t ) ) . into( ) ,
224285 } ) ) ,
225286 }
226287 }
227288 }
228289 ) *
229-
230290 } ;
231291}
232292
0 commit comments