fake_serialize/
lib.rs

1///! A rust macro for implementing dummy implementations of the traits
2///!  `serde::Serialize` and `serde::Deserialize`
3///!
4///! Sometimes, you run in the problem to use some trait or function from an external crate, that is
5///! constraint to types that implement the traits `serde::Serialize` or/and `serde::Deserialize`, even if 
6///! this is not an requirement for all use cases. Here, using a dummy implementation that just returns
7///! an error if `serialize` or `deserialize` is calls comes handy.
8///!
9///! This crate provides a derive macro that just provides these dummy implementations, e.g.
10///! ```rust
11///! use fake_serialize::{FakeSerialize,FakeDeserialize};
12///!
13///! #[derive(FakeSerialize,FakeDeserialize)]
14///! struct SomeStruct {
15///!     ...
16///! }
17///! ```
18
19
20extern crate proc_macro;
21extern crate syn;
22#[macro_use]
23extern crate quote;
24
25use proc_macro::TokenStream;
26
27#[proc_macro_derive(FakeSerialize)]
28/// Implement fake serialize for given type
29pub 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)]
36/// Implement fake deserialize for given type
37pub fn fake_deserialize_derive(input: TokenStream) -> TokenStream {
38    let ast = syn::parse(input).unwrap();
39
40    impl_fake_deserialize_macro(&ast)
41}
42
43/// Implementation details of fake serialize
44fn 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
59/// Implementation details of fake deserialize
60fn 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}