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);