diff --git a/src/io/transport.rs b/src/io/transport.rs index 7ecfdfd..5dfeb3b 100644 --- a/src/io/transport.rs +++ b/src/io/transport.rs @@ -316,7 +316,7 @@ impl PacketStream { } } - Ok((h.unwrap(), b)) + Ok((h.ok_or(Error::Driver(DriverError::UnexpectedPacket))?, b)) } pub(crate) fn take_transport(&mut self) -> Option { diff --git a/src/types/from_sql.rs b/src/types/from_sql.rs index a5e580d..a327482 100644 --- a/src/types/from_sql.rs +++ b/src/types/from_sql.rs @@ -176,7 +176,10 @@ impl<'a> FromSql<'a> for uuid::Uuid { } macro_rules! from_sql_vec_impl { - ( $( $t:ty: $k:pat => $f:expr ),* ) => { + // Base case: Vec + ( + $($t:ty: $k:pat => $f:expr),* + ) => { $( impl<'a> FromSql<'a> for Vec<$t> { fn from_sql(value: ValueRef<'a>) -> FromSqlResult { @@ -200,6 +203,36 @@ macro_rules! from_sql_vec_impl { } } } + // Recursive case: Vec> + impl<'a> FromSql<'a> for Vec> { + fn from_sql(value: ValueRef<'a>) -> FromSqlResult { + match value { + ValueRef::Array(SqlType::Array(_), outer_vs) => { + let mut result = Vec::with_capacity(outer_vs.len()); + for outer_v in outer_vs.iter() { + match outer_v { + ValueRef::Array($k, inner_vs) => { + let f: fn(ValueRef<'a>) -> FromSqlResult<$t> = $f; + let inner: Vec<$t> = inner_vs.iter().map(|inner_v| f(inner_v.clone())).collect::, _>>()?; + result.push(inner); + } + _ => { + return Err(Error::FromSql(FromSqlError::InvalidType { + src: SqlType::from(outer_v.clone()).to_string(), + dst: format!("Vec>", stringify!($t)).into(), + })); + } + } + } + Ok(result) + } + _ => Err(Error::FromSql(FromSqlError::InvalidType { + src: SqlType::from(value.clone()).to_string(), + dst: format!("Vec>", stringify!($t)).into(), + })), + } + } + } )* }; }