Skip to content

Commit 7c8feff

Browse files
committed
diff
1 parent 623515c commit 7c8feff

File tree

1 file changed

+77
-17
lines changed

1 file changed

+77
-17
lines changed

src/types/from_sql.rs

+77-17
Original file line numberDiff line numberDiff line change
@@ -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+
// }
178232
macro_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

Comments
 (0)