domain.rs

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