use crate::{
Column, Constraint, DefaultValue, GeneratedValue, Index, Schema, SchemaError, Table,
ValueShapeValidator, View,
};
use sim_kernel::Datum;
use sim_relation_core::{ColumnName, DomainCatalog, DomainId, SchemaName, TableName};
pub struct ColumnBuilder(Column);
impl ColumnBuilder {
pub fn required(name: ColumnName, domain: DomainId) -> Self {
Self(Column {
name,
domain,
nullable: false,
default: None,
generated: None,
})
}
pub fn nullable(name: ColumnName, domain: DomainId) -> Self {
Self(Column {
name,
domain,
nullable: true,
default: None,
generated: None,
})
}
pub fn default(mut self, value: Datum) -> Self {
self.0.default = Some(DefaultValue(value));
self
}
pub fn generated(mut self, value: GeneratedValue) -> Self {
self.0.generated = Some(value);
self
}
pub fn build(self) -> Column {
self.0
}
}
pub struct TableBuilder(Table);
impl TableBuilder {
pub fn new(name: TableName) -> Self {
Self(Table {
name,
columns: Vec::new(),
constraints: Vec::new(),
indexes: Vec::new(),
})
}
pub fn column(mut self, column: Column) -> Self {
self.0.columns.push(column);
self
}
pub fn constraint(mut self, value: Constraint) -> Self {
self.0.constraints.push(value);
self
}
pub fn index(mut self, value: Index) -> Self {
self.0.indexes.push(value);
self
}
pub fn build(self) -> Table {
self.0
}
}
pub struct SchemaBuilder {
name: SchemaName,
tables: Vec<Table>,
views: Vec<View>,
}
impl SchemaBuilder {
pub fn new(name: SchemaName) -> Self {
Self {
name,
tables: Vec::new(),
views: Vec::new(),
}
}
pub fn table(mut self, value: Table) -> Self {
self.tables.push(value);
self
}
pub fn view(mut self, value: View) -> Self {
self.views.push(value);
self
}
pub fn build(
self,
domains: &DomainCatalog,
validator: &impl ValueShapeValidator,
) -> Result<Schema, SchemaError> {
Schema::new(self.name, self.tables, self.views, domains, validator)
}
}