Skip to main content

nimiq_database_value_derive/
lib.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, DeriveInput};
4
5#[proc_macro_derive(DbSerializable)]
6pub fn derive_serialize(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
7    let ast = parse_macro_input!(input as DeriveInput);
8    proc_macro::TokenStream::from(impl_db_serialize(&ast))
9}
10
11fn impl_db_serialize(ast: &DeriveInput) -> TokenStream {
12    let name = &ast.ident;
13    let (impl_generics, ty_generics, _) = ast.generics.split_for_impl();
14
15    let generated = quote! {
16        impl #impl_generics ::nimiq_database_value::AsDatabaseBytes for #name #ty_generics where #name #ty_generics: ::nimiq_hash::nimiq_serde::Serialize {
17            fn as_key_bytes(&self) -> std::borrow::Cow<[u8]> {
18                std::borrow::Cow::Owned(::nimiq_hash::nimiq_serde::Serialize::serialize_to_vec(&self))
19            }
20        }
21
22        impl #impl_generics ::nimiq_database_value::FromDatabaseBytes for #name #ty_generics where #name #ty_generics: ::nimiq_hash::nimiq_serde::Deserialize {
23            fn from_key_bytes(bytes: &[u8]) -> Self {
24                ::nimiq_hash::nimiq_serde::Deserialize::deserialize_from_vec(bytes).unwrap()
25            }
26        }
27
28        impl #impl_generics ::nimiq_database_value::IntoDatabaseValue for #name #ty_generics where #name #ty_generics: ::nimiq_hash::nimiq_serde::Deserialize {
29            fn database_byte_size(&self) -> usize {
30                ::nimiq_hash::nimiq_serde::Serialize::serialized_size(&self)
31            }
32
33            fn copy_into_database(&self, mut bytes: &mut [u8]) {
34                ::nimiq_hash::nimiq_serde::Serialize::serialize(&self, &mut bytes).unwrap();
35            }
36        }
37    };
38    generated
39}