use std::marker::PhantomData;
use diesel::backend::Backend;
use diesel::deserialize::{self, FromSql};
use diesel::serialize::{self, Output, ToSql};
use diesel::sql_types::Text;
use diesel::{AsExpression, FromSqlRow};
use super::{Classified, ClassifiedField};
#[derive(AsExpression, FromSqlRow, Clone)]
#[diesel(sql_type = Text)]
pub struct ClassifiedText<F: ClassifiedField>(String, PhantomData<fn() -> F>);
impl<F: ClassifiedField> From<Classified<String, F>> for ClassifiedText<F> {
fn from(value: Classified<String, F>) -> Self {
Self(value.into_column_value(), PhantomData)
}
}
impl<F: ClassifiedField> From<ClassifiedText<F>> for Classified<String, F> {
fn from(column: ClassifiedText<F>) -> Self {
Self::new(column.0)
}
}
impl<F: ClassifiedField> std::fmt::Debug for ClassifiedText<F> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("ClassifiedText(<classified>)")
}
}
impl<F, DB> ToSql<Text, DB> for ClassifiedText<F>
where
F: ClassifiedField,
DB: Backend,
String: ToSql<Text, DB>,
{
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> serialize::Result {
<String as ToSql<Text, DB>>::to_sql(&self.0, out)
}
}
impl<F, DB> FromSql<Text, DB> for ClassifiedText<F>
where
F: ClassifiedField,
DB: Backend,
String: FromSql<Text, DB>,
{
fn from_sql(bytes: DB::RawValue<'_>) -> deserialize::Result<Self> {
String::from_sql(bytes).map(|value| Self(value, PhantomData))
}
}