thruput-macros 0.58.0

Macros for smart contract development
Documentation
use proc_macro::TokenStream;
use sha2::{Digest, Sha256};

pub fn storage_key_static(input: syn::LitStr) -> TokenStream {
    let hash = Sha256::digest(input.value());

    TokenStream::from(quote::quote! {
        ::thruput_sdk::types::StorageKey::new([#(#hash),*])
    })
}

pub fn sha256_static(input: syn::LitStr) -> TokenStream {
    let hash = Sha256::digest(input.value());

    TokenStream::from(quote::quote! {
        ::thruput_sdk::types::SHA256Hash::new([#(#hash),*])
    })
}

pub fn sha256_ident(input: syn::Ident) -> TokenStream {
    let string = input.to_string();
    let hash = Sha256::digest(string);

    TokenStream::from(quote::quote! {
        ::thruput_sdk::types::SHA256Hash::new([#(#hash),*])
    })
}

pub fn sha256_array_ident(input: syn::Ident) -> TokenStream {
    let string = input.to_string();
    let hash = Sha256::digest(string);

    TokenStream::from(quote::quote! {
        [#(#hash),*]
    })
}

pub fn sha256_array(input: syn::Lit) -> TokenStream {
    let value = match lit_bytes(&input) {
        Ok(v) => v,
        Err(e) => return e,
    };
    let hash = Sha256::digest(value);

    TokenStream::from(quote::quote! {
        [#(#hash),*]
    })
}

fn lit_bytes(lit: &syn::Lit) -> Result<Vec<u8>, TokenStream> {
    use syn::*;

    match lit {
        Lit::Str(lit_str) => Ok(lit_str.value().as_bytes().into()),
        Lit::ByteStr(lit_bstr) => Ok(lit_bstr.value()),
        _ => Err(syn::Error::new(
            lit.span(),
            "Can't convert literal to bytestring",
        )
        .into_compile_error()
        .into()),
    }
}