nimiq_database_value_derive/
lib.rs1use 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}