diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-16 13:36:38 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-16 13:36:38 +0200 |
commit | 1cff1e8737e27df4ef186f16b5ea5aa8b0d103e6 (patch) | |
tree | 49b5357f9f761778a01c0ec67fc72014a9911cd3 | |
parent | 6645f43eba0031009f18ec7d8c5167138d8442bb (diff) |
add Deserialize derive macro
-rw-r--r-- | src/lib.rs | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -26,3 +26,28 @@ pub fn derive_serialize(item: TokenStream) -> TokenStream { ) .into() } + +#[proc_macro_derive(Deserialize)] +pub fn derive_deserialize(item: TokenStream) -> TokenStream { + let ast: ItemStruct = parse(item).unwrap(); + let name = ast.ident; + + let deserializers = ast.fields.iter().map(|field| { + let field_name = field.ident.as_ref().expect("should be a names struct"); + + quote!( + self.#field_name.deserialize(r)?; + ) + }); + + quote!( + impl Deserialize for #name { + fn deserialize<R: std::io::Read>(&mut self, r: &mut R) -> Result<()> { + #(#deserializers) * + + Ok(()) + } + } + ) + .into() +} |