use crate::{ColumnTrait, EntityTrait, IdenStatic}; use sea_query::{Alias, DynIden, Iden, IntoIden, SeaRc}; use std::fmt; #[derive(Debug, Clone)] pub enum Identity { Unary(DynIden), Binary(DynIden, DynIden), Ternary(DynIden, DynIden, DynIden), } impl Iden for Identity { fn unquoted(&self, s: &mut dyn fmt::Write) { match self { Identity::Unary(iden) => { write!(s, "{}", iden.to_string()).unwrap(); } Identity::Binary(iden1, iden2) => { write!(s, "{}", iden1.to_string()).unwrap(); write!(s, "{}", iden2.to_string()).unwrap(); } Identity::Ternary(iden1, iden2, iden3) => { write!(s, "{}", iden1.to_string()).unwrap(); write!(s, "{}", iden2.to_string()).unwrap(); write!(s, "{}", iden3.to_string()).unwrap(); } } } } pub trait IntoIdentity { fn into_identity(self) -> Identity; } pub trait IdentityOf where E: EntityTrait, { fn identity_of(self) -> Identity; } impl IntoIdentity for String { fn into_identity(self) -> Identity { self.as_str().into_identity() } } impl IntoIdentity for &str { fn into_identity(self) -> Identity { Identity::Unary(SeaRc::new(Alias::new(self))) } } impl IntoIdentity for T where T: IdenStatic, { fn into_identity(self) -> Identity { Identity::Unary(self.into_iden()) } } impl IntoIdentity for (T, C) where T: IdenStatic, C: IdenStatic, { fn into_identity(self) -> Identity { Identity::Binary(self.0.into_iden(), self.1.into_iden()) } } impl IntoIdentity for (T, C, R) where T: IdenStatic, C: IdenStatic, R: IdenStatic, { fn into_identity(self) -> Identity { Identity::Ternary(self.0.into_iden(), self.1.into_iden(), self.2.into_iden()) } } impl IdentityOf for C where E: EntityTrait, C: ColumnTrait, { fn identity_of(self) -> Identity { self.into_identity() } } impl IdentityOf for (C, C) where E: EntityTrait, C: ColumnTrait, { fn identity_of(self) -> Identity { self.into_identity() } } impl IdentityOf for (C, C, C) where E: EntityTrait, C: ColumnTrait, { fn identity_of(self) -> Identity { self.into_identity() } }