Skip to main content

schema_model/model/
types.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2pub enum DatabaseType {
3    Postgresql,
4    Sqlite,
5    SqlServer,
6}
7
8impl DatabaseType {
9    pub fn statement_separator(&self) -> &'static str {
10        match self {
11            DatabaseType::Postgresql => ";",
12            DatabaseType::Sqlite => ";",
13            DatabaseType::SqlServer => "\nGO",
14        }
15    }
16
17    pub fn max_key_name_length(&self) -> usize {
18        match self {
19            DatabaseType::Postgresql => 63,
20            DatabaseType::Sqlite => 128,
21            DatabaseType::SqlServer => 128,
22        }
23    }
24}
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
27pub enum RelationType {
28    Cascade,
29    Enforce,
30    SetNull,
31    DoNothing,
32}
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
35pub enum BooleanMode {
36    Native,
37    YesNo,
38    YN,
39}
40
41impl Default for BooleanMode {
42    fn default() -> Self {
43        BooleanMode::Native
44    }
45}
46
47impl FromStr for BooleanMode {
48    type Err = String;
49
50    fn from_str(s: &str) -> Result<Self, Self::Err> {
51        match s.to_lowercase().as_str() {
52            "native" => Ok(BooleanMode::Native),
53            "yesno" => Ok(BooleanMode::YesNo),
54            "yn" => Ok(BooleanMode::YN),
55            _ => Err(format!("Unknown boolean mode: {}", s)),
56        }
57    }
58}
59
60#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
61pub enum ForeignKeyMode {
62    None,
63    Relations,
64    Triggers,
65}
66
67impl Default for ForeignKeyMode {
68    fn default() -> Self {
69        ForeignKeyMode::Relations
70    }
71}
72
73impl FromStr for ForeignKeyMode {
74    type Err = String;
75
76    fn from_str(s: &str) -> Result<Self, Self::Err> {
77        match s.to_lowercase().as_str() {
78            "none" => Ok(ForeignKeyMode::None),
79            "relations" => Ok(ForeignKeyMode::Relations),
80            "triggers" => Ok(ForeignKeyMode::Triggers),
81            _ => Err(format!("Unknown foreign key mode: {}", s)),
82        }
83    }
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
87pub enum OtherSqlOrder {
88    Bottom,
89    Top,
90}
91
92#[derive(Debug, Clone, PartialEq, Eq, Hash)]
93pub enum TableOption {
94    Data,
95    NoExport,
96    Compress,
97}
98
99#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
100pub enum TriggerType {
101    Update,
102    Delete,
103}
104
105#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
106pub enum KeyType {
107    Primary,
108    Unique,
109    Index,
110}
111
112#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
113pub enum LockEscalation {
114    Auto,
115    Disable,
116    Table,
117}
118
119impl Default for LockEscalation {
120    fn default() -> Self {
121        LockEscalation::Auto
122    }
123}
124
125impl FromStr for LockEscalation {
126    type Err = String;
127
128    fn from_str(s: &str) -> Result<Self, Self::Err> {
129        match s.to_lowercase().as_str() {
130            "auto" => Ok(LockEscalation::Auto),
131            "disable" => Ok(LockEscalation::Disable),
132            "table" => Ok(LockEscalation::Table),
133            _ => Err(format!("Unknown lock escalation: {}", s)),
134        }
135    }
136}
137
138// Re-export Version so external crates can access it via model::types
139pub use crate::model::version::Version;
140use std::str::FromStr;
141
142#[cfg(test)]
143mod tests {
144    use super::*;
145
146    #[test]
147    fn boolean_mode_default_is_native() {
148        let bm = BooleanMode::default();
149        assert_eq!(bm, BooleanMode::Native);
150    }
151
152    #[test]
153    fn enums_equality_and_copy() {
154        let db: DatabaseType = DatabaseType::Postgresql;
155        let db2 = db;
156        assert_eq!(db, db2);
157
158        let t1 = TriggerType::Update;
159        let t2 = TriggerType::Update;
160        assert_eq!(t1, t2);
161
162        let rel = RelationType::Cascade;
163        assert_eq!(rel, RelationType::Cascade);
164
165        let k = KeyType::Primary;
166        assert_eq!(k, KeyType::Primary);
167
168        let fk = ForeignKeyMode::Relations;
169        assert_eq!(fk, ForeignKeyMode::Relations);
170
171        let ord = OtherSqlOrder::Top;
172        assert_eq!(ord, OtherSqlOrder::Top);
173
174        let le = LockEscalation::Auto;
175        assert_eq!(le, LockEscalation::Auto);
176    }
177
178    #[test]
179    fn table_option_equality() {
180        assert_eq!(TableOption::Compress, TableOption::Compress);
181        assert_ne!(TableOption::Data, TableOption::NoExport);
182    }
183}