use super::HasSchema;
use super::TableColumns;
use super::TableInfo;
use crate::Syntax;
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct TableIdent {
pub(crate) schema: Option<String>,
pub(crate) name: String,
}
impl std::fmt::Display for TableIdent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(s) = &self.schema {
f.write_str(s)?;
f.write_str(".")?;
}
f.write_str(&self.name)?;
Ok(())
}
}
impl TableIdent {
pub fn from_model<T>() -> TableIdent
where
T: HasSchema,
<T as HasSchema>::Schema: TableInfo + TableColumns,
{
let fullname = <T as HasSchema>::Schema::identifier().join(".");
Self::parse(&fullname)
}
pub fn new(table_name: impl Into<String>, schema_name: Option<impl Into<String>>) -> Self {
let table_name = table_name.into();
let schema_name = schema_name.map(|x| x.into());
Self {
name: table_name,
schema: schema_name,
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn schema(&self) -> Option<&str> {
self.schema.as_deref()
}
pub fn parse(raw: &str) -> Self {
let parts: Vec<&str> = raw.split('.').collect();
let parts: Vec<&str> = parts.iter().rev().take(2).cloned().collect();
let name = parts
.first()
.cloned()
.map(|x| x.to_owned())
.unwrap_or_default();
let schema = parts.get(1).cloned().map(|x| x.to_owned());
Self { schema, name }
}
pub fn equals(&self, schema: &Option<String>, name: &str) -> bool {
&self.schema == schema && self.name == name
}
pub fn default_namespace(syntax: Syntax) -> Option<&'static str> {
match syntax {
Syntax::Mssql => Some("dbo"),
Syntax::Postgres => Some("public"),
Syntax::Mysql => None,
Syntax::Sqlite => None,
}
}
}