Skip to main content

schema_model/model/
database_model.rs

1use crate::model::enum_type::EnumType;
2use crate::model::schema::Schema;
3use crate::model::table::Table;
4use crate::model::types::{BooleanMode, ForeignKeyMode, Version};
5
6#[derive(Debug, Default)]
7pub struct DatabaseModel {
8    version: Option<Version>,
9    foreign_key_mode: ForeignKeyMode,
10    boolean_mode: BooleanMode,
11    schemas: Vec<Schema>,
12}
13
14impl DatabaseModel {
15    pub fn new(version: Option<Version>,
16               boolean_mode: BooleanMode,
17               foreign_key_mode: ForeignKeyMode,
18               schemas: Vec<Schema>) -> Self {
19        Self {
20            version,
21            boolean_mode,
22            foreign_key_mode,
23            schemas,
24        }
25    }
26
27    pub fn version(&self) -> Option<&Version> {
28        self.version.as_ref()
29    }
30
31    pub fn foreign_key_mode(&self) -> ForeignKeyMode {
32        self.foreign_key_mode
33    }
34
35    pub fn boolean_mode(&self) -> BooleanMode {
36        self.boolean_mode
37    }
38
39    pub fn schemas(&self) -> &Vec<Schema> {
40        &self.schemas
41    }
42
43    pub fn default_schema(&self) -> &Schema {
44        self.schemas
45            .iter()
46            .find(|s| s.schema_name().is_none())
47            .expect("Default schema not found")
48    }
49
50    pub fn default_schema_mut(&mut self) -> &mut Schema {
51        self.schemas
52            .iter_mut()
53            .find(|s| s.schema_name().is_none())
54            .expect("Default schema not found")
55    }
56
57    pub fn find_schema(&self, schema_name: Option<&str>) -> &Schema {
58        if schema_name.is_none() {
59            return self.default_schema();
60        }
61
62        self.schemas
63            .iter()
64            .filter(|s| s.schema_name().is_some())
65            .find(|s| s.schema_name().unwrap() == schema_name.unwrap())
66            .expect("Schema not found")
67    }
68
69    pub(crate) fn find_schema_mut(&mut self, schema_name: Option<&str>) -> &mut Schema {
70        if schema_name.is_none() {
71            return self.default_schema_mut();
72        }
73
74        self.schemas
75            .iter_mut()
76            .filter(|s| s.schema_name().is_some())
77            .find(|s| s.schema_name().unwrap() == schema_name.unwrap())
78            .expect("Schema not found")
79    }
80
81    pub fn find_enum_type(&self, schema_name: Option<&str>, enum_type: &str) -> &EnumType {
82        let schema = self.find_schema(schema_name);
83        schema.get_enum_type(enum_type)
84    }
85
86    pub fn all_tables(&self) -> Vec<&Table> {
87        self.schemas
88            .iter()
89            .flat_map(|s| s.tables())
90            .collect()
91    }
92
93    pub fn find_table(&self, schema_name: Option<&str>, table_name: &str) -> &Table {
94        let schema = self.find_schema(schema_name);
95        schema.get_table(table_name)
96    }
97
98    pub fn find_table_mut(&mut self, schema_name: Option<&str>, table_name: &str) -> &mut Table {
99        let schema = self.find_schema_mut(schema_name);
100        schema.get_table_mut(table_name)
101    }
102}