#[cfg(feature = "diesel_postgres")]
pub mod postgres {
use proc_macro2::TokenStream;
use quote::quote;
use syn::Ident;
pub fn impl_sql_conv(ident: &Ident) -> TokenStream {
let mut ast = impl_to_sql(ident);
ast.extend(impl_from_sql(ident));
ast
}
fn impl_to_sql(ident: &Ident) -> TokenStream {
let ser = quote!(diesel::serialize);
let to_sql = quote!(#ser::ToSql<diesel::sql_types::Text, diesel::pg::Pg>);
quote! {
impl #to_sql for #ident {
fn to_sql<W: ::std::io::Write>(
&self, out: &mut #ser::Output<'_, W, diesel::pg::Pg>,
) -> #ser::Result {
let val = unitval::AsUnitVal::as_unitval(&*self);
#ser::ToSql::<diesel::sql_types::Text, diesel::pg::Pg>::to_sql(val, out)
}
}
}
}
fn impl_from_sql(ident: &Ident) -> TokenStream {
let de = quote!(diesel::deserialize);
let from_sql = quote!(#de::FromSql<diesel::sql_types::Text, diesel::pg::Pg>);
quote! {
impl #from_sql for #ident {
fn from_sql(bytes: Option<&[u8]>) -> #de::Result<Self> {
let id_str = <String as #from_sql>::from_sql(bytes)?;
<Self as unitval::FromUnitVal>::from_unitval(&id_str).map_err(|e| e.into())
}
}
}
}
}