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}