Skip to main content

schema_model/builder/
schema.rs

1use crate::model::enum_type::EnumType;
2use crate::model::function::Function;
3use crate::model::other_sql::OtherSql;
4use crate::model::procedure::Procedure;
5use crate::model::schema::Schema;
6use crate::model::table::Table;
7use crate::model::view::View;
8
9/// SchemaBuilder accumulates intermediate state and produces an immutable Schema on build.
10#[derive(Debug, Default)]
11pub struct SchemaBuilder {
12    schema: Schema,
13}
14
15impl SchemaBuilder {
16    pub fn new<S: Into<String>>(schema_name: Option<S>) -> Self {
17        Self {
18            schema: Schema::new(schema_name.map(|s| s.into())),
19        }
20    }
21
22    /// Add a fully prepared Table value.
23    pub fn add_table(mut self, table: Table) -> Self {
24        self.schema.add_table(table);
25        self
26    }
27    /// Add a View.
28    pub fn add_view(mut self, view: View) -> Self {
29        self.schema.add_view(view);
30        self
31    }
32    /// Add an enum type.
33    pub fn add_enum_type(mut self, enum_type: EnumType) -> Self {
34        self.schema.add_enum_type(enum_type);
35        self
36    }
37    /// Add functions.
38    pub fn add_functions(mut self, functions: Vec<Function>) -> Self {
39        self.schema.add_functions(functions);
40        self
41    }
42    /// Add procedures.
43    pub fn add_procedures(mut self, procedures: Vec<Procedure>) -> Self {
44        self.schema.add_procedures(procedures);
45        self
46    }
47    /// Add an OtherSql.
48    pub fn add_other_sql(mut self, other_sql: OtherSql) -> Self {
49        self.schema.add_other_sql(other_sql);
50        self
51    }
52
53    pub fn case_sensitive_text(mut self, value: bool) -> Self {
54        self.schema.set_case_sensitive_text(value);
55        self
56    }
57
58    /// Finalize and return the fully-populated Schema.
59    pub fn build(self) -> Schema {
60        self.schema
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67    use crate::builder::{ColumnBuilder, KeyBuilder, TableBuilder};
68    use crate::model::column_type::ColumnType;
69    use crate::model::types::KeyType;
70
71    #[test]
72    fn build_schema_with_table_and_pk() {
73        let table = TableBuilder::new(None, "users")
74            .add_column(
75                ColumnBuilder::new(None, "id", ColumnType::Int)
76                    .required(true)
77                    .build(),
78            )
79            .add_column(ColumnBuilder::new(None, "name", ColumnType::Varchar).build())
80            .add_key(KeyBuilder::new(KeyType::Primary).add_column("id").build())
81            .build();
82
83        let schema = SchemaBuilder::new(None::<&str>).add_table(table).build();
84
85        assert_eq!(schema.tables().len(), 1);
86        assert_eq!(schema.tables()[0].name(), "users");
87    }
88}