extern crate proc_macro;
extern crate syn;
#[macro_use]
extern crate quote;
use proc_macro::TokenStream;
#[proc_macro_derive(FakeSerialize)]
pub fn fake_serialize_derive(input: TokenStream) -> TokenStream {
let ast = syn::parse(input).unwrap();
impl_fake_serialize_macro(&ast)
}
#[proc_macro_derive(FakeDeserialize)]
pub fn fake_deserialize_derive(input: TokenStream) -> TokenStream {
let ast = syn::parse(input).unwrap();
impl_fake_deserialize_macro(&ast)
}
fn impl_fake_serialize_macro(ast: &syn::DeriveInput) -> TokenStream {
let name = &ast.ident;
let gen = quote! {
impl serde::Serialize for #name {
fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer
{
Err(serde::ser::Error::custom(format!("serialization is disabled for this type")))
}
}
};
gen.into()
}
fn impl_fake_deserialize_macro(ast: &syn::DeriveInput) -> TokenStream {
let name = &ast.ident;
let gen = quote! {
impl<'de> serde::Deserialize<'de> for #name {
fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>
{
Err(serde::de::Error::custom(format!("deserialization is disabled for this type")))
}
}
};
gen.into()
}