use std::borrow::Cow;
use std::fmt;
pub trait Iden {
fn as_str(&self) -> &str;
}
impl Iden for &str {
fn as_str(&self) -> &str {
self
}
}
impl Iden for String {
fn as_str(&self) -> &str {
self
}
}
impl Iden for Ident {
fn as_str(&self) -> &str {
&self.0
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Ident(pub Cow<'static, str>);
impl Ident {
pub const fn new_static(name: &'static str) -> Self {
Ident(Cow::Borrowed(name))
}
pub fn name(&self) -> &str {
&self.0
}
}
impl fmt::Display for Ident {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.0)
}
}
pub trait IntoIden {
fn into_iden(self) -> Ident;
}
impl IntoIden for Ident {
fn into_iden(self) -> Ident {
self
}
}
impl IntoIden for &'static str {
fn into_iden(self) -> Ident {
Ident(Cow::Borrowed(self))
}
}
impl IntoIden for String {
fn into_iden(self) -> Ident {
Ident(Cow::Owned(self))
}
}
impl<T: Iden + ?Sized> IntoIden for &T
where
T: IdenOwnedMarker,
{
fn into_iden(self) -> Ident {
Ident(Cow::Owned(self.as_str().to_owned()))
}
}
pub trait IdenOwnedMarker {}
impl From<&'static str> for Ident {
fn from(v: &'static str) -> Self {
v.into_iden()
}
}
impl From<String> for Ident {
fn from(v: String) -> Self {
v.into_iden()
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TableRef {
pub name: Ident,
pub alias: Option<Ident>,
}
impl TableRef {
pub fn new(name: impl IntoIden) -> Self {
Self {
name: name.into_iden(),
alias: None,
}
}
#[must_use]
pub fn alias(mut self, alias: impl IntoIden) -> Self {
self.alias = Some(alias.into_iden());
self
}
pub fn reference(&self) -> &Ident {
self.alias.as_ref().unwrap_or(&self.name)
}
}
impl<T: IntoIden> From<T> for TableRef {
fn from(name: T) -> Self {
TableRef::new(name)
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ColumnRef {
Column(Ident),
TableColumn(Ident, Ident),
Asterisk,
TableAsterisk(Ident),
}
impl<T: IntoIden> From<T> for ColumnRef {
fn from(name: T) -> Self {
ColumnRef::Column(name.into_iden())
}
}
impl<T: IntoIden, C: IntoIden> From<(T, C)> for ColumnRef {
fn from((table, column): (T, C)) -> Self {
ColumnRef::TableColumn(table.into_iden(), column.into_iden())
}
}