use crate::model::enum_type::EnumType;
use crate::model::function::Function;
use crate::model::other_sql::OtherSql;
use crate::model::procedure::Procedure;
use crate::model::schema::Schema;
use crate::model::table::Table;
use crate::model::view::View;
#[derive(Debug, Default)]
pub struct SchemaBuilder {
schema: Schema,
}
impl SchemaBuilder {
pub fn new<S: Into<String>>(schema_name: Option<S>) -> Self {
Self {
schema: Schema::new(schema_name.map(|s| s.into())),
}
}
pub fn add_table(mut self, table: Table) -> Self {
self.schema.add_table(table);
self
}
pub fn add_view(mut self, view: View) -> Self {
self.schema.add_view(view);
self
}
pub fn add_enum_type(mut self, enum_type: EnumType) -> Self {
self.schema.add_enum_type(enum_type);
self
}
pub fn add_functions(mut self, functions: Vec<Function>) -> Self {
self.schema.add_functions(functions);
self
}
pub fn add_procedures(mut self, procedures: Vec<Procedure>) -> Self {
self.schema.add_procedures(procedures);
self
}
pub fn add_other_sql(mut self, other_sql: OtherSql) -> Self {
self.schema.add_other_sql(other_sql);
self
}
pub fn case_sensitive_text(mut self, value: bool) -> Self {
self.schema.set_case_sensitive_text(value);
self
}
pub fn build(self) -> Schema {
self.schema
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::builder::{ColumnBuilder, KeyBuilder, TableBuilder};
use crate::model::column_type::ColumnType;
use crate::model::types::KeyType;
#[test]
fn build_schema_with_table_and_pk() {
let table = TableBuilder::new(None, "users")
.add_column(
ColumnBuilder::new(None, "id", ColumnType::Int)
.required(true)
.build(),
)
.add_column(ColumnBuilder::new(None, "name", ColumnType::Varchar).build())
.add_key(KeyBuilder::new(KeyType::Primary).add_column("id").build())
.build();
let schema = SchemaBuilder::new(None::<&str>).add_table(table).build();
assert_eq!(schema.tables().len(), 1);
assert_eq!(schema.tables()[0].name(), "users");
}
}