aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-05-16 13:36:38 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-05-16 13:36:38 +0200
commit1cff1e8737e27df4ef186f16b5ea5aa8b0d103e6 (patch)
tree49b5357f9f761778a01c0ec67fc72014a9911cd3
parent6645f43eba0031009f18ec7d8c5167138d8442bb (diff)
add Deserialize derive macro
-rw-r--r--src/lib.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index bf0b80c..9a9e8a3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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()
+}