1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use rusqlite::types::FromSql;
use rusqlite::Row;
use crate::db::FromRow;
fn inc(n: &mut usize) -> usize {
let v = *n;
(*n) = v + 1;
v
}
macro_rules! derive_tuple {
($($field:ident)*) => {
impl<$($field: FromSql,)*> FromRow for ($($field,)*) {
fn from_row(row: &Row) -> rusqlite::Result<Self> {
let mut cursor = 0;
Ok((
$(
{
let _name = stringify!($field);
row.get(inc(&mut cursor))?
},
)*
))
}
}
};
}
macro_rules! derive_common_tuples {
() => {};
($first:ident $($rest:ident)*) => {
derive_tuple!($first $($rest)*);
derive_common_tuples!($($rest)*);
};
}
derive_common_tuples!(T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16);