#[derive(Clone, Copy)]
pub struct ResolvedTableReference<'a> {
pub catalog: &'a str,
pub schema: &'a str,
pub table: &'a str,
}
#[derive(Clone, Copy)]
pub enum TableReference<'a> {
Bare {
table: &'a str,
},
Partial {
schema: &'a str,
table: &'a str,
},
Full {
catalog: &'a str,
schema: &'a str,
table: &'a str,
},
}
impl<'a> TableReference<'a> {
pub fn table(&self) -> &str {
match self {
Self::Full { table, .. }
| Self::Partial { table, .. }
| Self::Bare { table } => table,
}
}
pub fn resolve(
self,
default_catalog: &'a str,
default_schema: &'a str,
) -> ResolvedTableReference<'a> {
match self {
Self::Full {
catalog,
schema,
table,
} => ResolvedTableReference {
catalog,
schema,
table,
},
Self::Partial { schema, table } => ResolvedTableReference {
catalog: default_catalog,
schema,
table,
},
Self::Bare { table } => ResolvedTableReference {
catalog: default_catalog,
schema: default_schema,
table,
},
}
}
}
impl<'a> From<&'a str> for TableReference<'a> {
fn from(s: &'a str) -> Self {
let parts: Vec<&str> = s.split('.').collect();
match parts.len() {
1 => Self::Bare { table: s },
2 => Self::Partial {
schema: parts[0],
table: parts[1],
},
3 => Self::Full {
catalog: parts[0],
schema: parts[1],
table: parts[2],
},
_ => Self::Bare { table: s },
}
}
}
impl<'a> From<ResolvedTableReference<'a>> for TableReference<'a> {
fn from(resolved: ResolvedTableReference<'a>) -> Self {
Self::Full {
catalog: resolved.catalog,
schema: resolved.schema,
table: resolved.table,
}
}
}