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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use crate::postgres::def::{ForeignKeyAction, PrimaryKey, References, Unique};
use sea_query::{Alias, ForeignKey, ForeignKeyCreateStatement, Index, IndexCreateStatement};

impl PrimaryKey {
    pub fn write(&self) -> IndexCreateStatement {
        let mut idx = Index::create().primary().name(&self.name);
        for col in self.columns.iter() {
            idx = idx.col(Alias::new(col));
        }
        idx
    }
}

impl Unique {
    pub fn write(&self) -> IndexCreateStatement {
        let mut idx = Index::create().unique().name(&self.name);
        for col in self.columns.iter() {
            idx = idx.col(Alias::new(col));
        }
        idx
    }
}

impl References {
    pub fn write(&self) -> ForeignKeyCreateStatement {
        let mut key = ForeignKey::create().name(&self.name);
        key = key.to_tbl(Alias::new(&self.table));
        for column in self.columns.iter() {
            key = key.from_col(Alias::new(&column));
        }
        for ref_col in self.foreign_columns.iter() {
            key = key.to_col(Alias::new(&ref_col));
        }
        if let Some(on_update) = &self.on_update {
            key = key.on_update(match on_update {
                ForeignKeyAction::Cascade => sea_query::ForeignKeyAction::Cascade,
                ForeignKeyAction::SetNull => sea_query::ForeignKeyAction::SetNull,
                ForeignKeyAction::SetDefault => sea_query::ForeignKeyAction::SetDefault,
                ForeignKeyAction::Restrict => sea_query::ForeignKeyAction::Restrict,
                ForeignKeyAction::NoAction => sea_query::ForeignKeyAction::NoAction,
            });
        }
        if let Some(on_delete) = &self.on_delete {
            key = key.on_delete(match on_delete {
                ForeignKeyAction::Cascade => sea_query::ForeignKeyAction::Cascade,
                ForeignKeyAction::SetNull => sea_query::ForeignKeyAction::SetNull,
                ForeignKeyAction::SetDefault => sea_query::ForeignKeyAction::SetDefault,
                ForeignKeyAction::Restrict => sea_query::ForeignKeyAction::Restrict,
                ForeignKeyAction::NoAction => sea_query::ForeignKeyAction::NoAction,
            });
        }
        key
    }
}