domain.rs

 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}