unitval-derive 0.1.1

Provide values for unit enum variants
Documentation
#[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())
                }
            }
        }
    }
}