chuchi_postgres/row/
from.rs

1use super::Row;
2
3use std::error::Error as StdError;
4
5use postgres_types::FromSql;
6
7pub trait FromRowOwned: Sized {
8	fn from_row_owned(
9		row: Row,
10	) -> Result<Self, Box<dyn StdError + Sync + Send>>;
11}
12
13impl<T> FromRowOwned for T
14where
15	T: for<'r> FromRow<'r>,
16{
17	fn from_row_owned(
18		row: Row,
19	) -> Result<Self, Box<dyn StdError + Sync + Send>> {
20		T::from_row(&row)
21	}
22}
23
24pub trait FromRow<'r>: Sized {
25	fn from_row(row: &'r Row) -> Result<Self, Box<dyn StdError + Sync + Send>>;
26}
27
28// pub struct Single<T>(pub T);
29
30impl<'r, T> FromRow<'r> for [T; 1]
31where
32	T: FromSql<'r>,
33{
34	fn from_row(row: &'r Row) -> Result<Self, Box<dyn StdError + Sync + Send>> {
35		Ok([row.try_get(0)?])
36	}
37}
38
39macro_rules! impl_tuple {
40	($($name:ident),*) => {
41		impl<'r, $($name),*> FromRow<'r> for ($($name),*)
42		where
43			$($name: FromSql<'r>),*
44		{
45			fn from_row(row: &'r Row) -> Result<Self, Box<dyn StdError + Sync + Send>> {
46				Ok(($(row.try_get(stringify!($name))?),*))
47			}
48		}
49	};
50}
51
52impl_tuple!(A, B);
53impl_tuple!(A, B, C);
54impl_tuple!(A, B, C, D);
55impl_tuple!(A, B, C, D, E);
56impl_tuple!(A, B, C, D, E, F);
57impl_tuple!(A, B, C, D, E, F, G);
58impl_tuple!(A, B, C, D, E, F, G, H);
59impl_tuple!(A, B, C, D, E, F, G, H, I);
60impl_tuple!(A, B, C, D, E, F, G, H, I, J);
61impl_tuple!(A, B, C, D, E, F, G, H, I, J, K);
62impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);
63impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M);
64impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
65impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
66impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);