1use crate::connection::Connection;
2
3pub trait Domain: 'static {
4 fn name() -> &'static str;
5 fn migrations() -> &'static [&'static str];
6}
7
8pub trait Migrator: 'static {
9 fn migrate(connection: &Connection) -> anyhow::Result<()>;
10}
11
12impl Migrator for () {
13 fn migrate(_connection: &Connection) -> anyhow::Result<()> {
14 Ok(()) // Do nothing
15 }
16}
17
18impl<D: Domain> Migrator for D {
19 fn migrate(connection: &Connection) -> anyhow::Result<()> {
20 connection.migrate(Self::name(), Self::migrations())
21 }
22}
23
24impl<D1: Domain, D2: Domain> Migrator for (D1, D2) {
25 fn migrate(connection: &Connection) -> anyhow::Result<()> {
26 D1::migrate(connection)?;
27 D2::migrate(connection)
28 }
29}
30
31impl<D1: Domain, D2: Domain, D3: Domain> Migrator for (D1, D2, D3) {
32 fn migrate(connection: &Connection) -> anyhow::Result<()> {
33 D1::migrate(connection)?;
34 D2::migrate(connection)?;
35 D3::migrate(connection)
36 }
37}
38
39impl<D1: Domain, D2: Domain, D3: Domain, D4: Domain> Migrator for (D1, D2, D3, D4) {
40 fn migrate(connection: &Connection) -> anyhow::Result<()> {
41 D1::migrate(connection)?;
42 D2::migrate(connection)?;
43 D3::migrate(connection)?;
44 D4::migrate(connection)
45 }
46}
47
48impl<D1: Domain, D2: Domain, D3: Domain, D4: Domain, D5: Domain> Migrator for (D1, D2, D3, D4, D5) {
49 fn migrate(connection: &Connection) -> anyhow::Result<()> {
50 D1::migrate(connection)?;
51 D2::migrate(connection)?;
52 D3::migrate(connection)?;
53 D4::migrate(connection)?;
54 D5::migrate(connection)
55 }
56}