use crate::{
tds::{codec::ColumnData, Numeric},
xml::XmlData,
};
use std::borrow::Cow;
use uuid::Uuid;
pub trait ToSql: Send + Sync {
fn to_sql(&self) -> ColumnData<'_>;
}
pub trait IntoSql<'a>: Send + Sync {
fn into_sql(self) -> ColumnData<'a>;
}
impl<'a> IntoSql<'a> for &'a str {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::String(Some(Cow::Borrowed(self)))
}
}
impl<'a> IntoSql<'a> for Option<&'a str> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::String(self.map(Cow::Borrowed))
}
}
impl<'a> IntoSql<'a> for &'a String {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::String(Some(Cow::Borrowed(self)))
}
}
impl<'a> IntoSql<'a> for Option<&'a String> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::String(self.map(Cow::from))
}
}
impl<'a> IntoSql<'a> for &'a [u8] {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Binary(Some(Cow::Borrowed(self)))
}
}
impl<'a> IntoSql<'a> for Option<&'a [u8]> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Binary(self.map(Cow::Borrowed))
}
}
impl<'a> IntoSql<'a> for &'a Vec<u8> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Binary(Some(Cow::from(self)))
}
}
impl<'a> IntoSql<'a> for Option<&'a Vec<u8>> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Binary(self.map(Cow::from))
}
}
impl<'a> IntoSql<'a> for Cow<'a, str> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::String(Some(self))
}
}
impl<'a> IntoSql<'a> for Option<Cow<'a, str>> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::String(self)
}
}
impl<'a> IntoSql<'a> for Cow<'a, [u8]> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Binary(Some(self))
}
}
impl<'a> IntoSql<'a> for Option<Cow<'a, [u8]>> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Binary(self)
}
}
impl<'a> IntoSql<'a> for &'a XmlData {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Xml(Some(Cow::Borrowed(self)))
}
}
impl<'a> IntoSql<'a> for Option<&'a XmlData> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Xml(self.map(Cow::Borrowed))
}
}
impl<'a> IntoSql<'a> for &'a Uuid {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Guid(Some(*self))
}
}
impl<'a> IntoSql<'a> for Option<&'a Uuid> {
fn into_sql(self) -> ColumnData<'a> {
ColumnData::Guid(self.copied())
}
}
into_sql!(self_,
String: (ColumnData::String, Cow::from(self_));
Vec<u8>: (ColumnData::Binary, Cow::from(self_));
Numeric: (ColumnData::Numeric, self_);
XmlData: (ColumnData::Xml, Cow::Owned(self_));
Uuid: (ColumnData::Guid, self_);
bool: (ColumnData::Bit, self_);
u8: (ColumnData::U8, self_);
i16: (ColumnData::I16, self_);
i32: (ColumnData::I32, self_);
i64: (ColumnData::I64, self_);
f32: (ColumnData::F32, self_);
f64: (ColumnData::F64, self_);
);
to_sql!(self_,
bool: (ColumnData::Bit, *self_);
u8: (ColumnData::U8, *self_);
i16: (ColumnData::I16, *self_);
i32: (ColumnData::I32, *self_);
i64: (ColumnData::I64, *self_);
f32: (ColumnData::F32, *self_);
f64: (ColumnData::F64, *self_);
&str: (ColumnData::String, Cow::from(*self_));
String: (ColumnData::String, Cow::from(self_));
Cow<'_, str>: (ColumnData::String, self_.clone());
&[u8]: (ColumnData::Binary, Cow::from(*self_));
Cow<'_, [u8]>: (ColumnData::Binary, self_.clone());
Vec<u8>: (ColumnData::Binary, Cow::from(self_));
Numeric: (ColumnData::Numeric, *self_);
XmlData: (ColumnData::Xml, Cow::Borrowed(self_));
Uuid: (ColumnData::Guid, *self_);
);