1extern crate proc_macro;
21extern crate syn;
22#[macro_use]
23extern crate quote;
24
25use proc_macro::TokenStream;
26
27#[proc_macro_derive(FakeSerialize)]
28pub fn fake_serialize_derive(input: TokenStream) -> TokenStream {
30 let ast = syn::parse(input).unwrap();
31
32 impl_fake_serialize_macro(&ast)
33}
34
35#[proc_macro_derive(FakeDeserialize)]
36pub fn fake_deserialize_derive(input: TokenStream) -> TokenStream {
38 let ast = syn::parse(input).unwrap();
39
40 impl_fake_deserialize_macro(&ast)
41}
42
43fn impl_fake_serialize_macro(ast: &syn::DeriveInput) -> TokenStream {
45 let name = &ast.ident;
46 let gen = quote! {
47 impl serde::Serialize for #name {
48 fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
49 where
50 S: serde::Serializer
51 {
52 Err(serde::ser::Error::custom(format!("serialization is disabled for this type")))
53 }
54 }
55 };
56 gen.into()
57}
58
59fn impl_fake_deserialize_macro(ast: &syn::DeriveInput) -> TokenStream {
61 let name = &ast.ident;
62 let gen = quote! {
63 impl<'de> serde::Deserialize<'de> for #name {
64 fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
65 where
66 D: serde::Deserializer<'de>
67 {
68 Err(serde::de::Error::custom(format!("deserialization is disabled for this type")))
69 }
70 }
71
72 };
73 gen.into()
74}