#![doc = include_str!("../README.md")]
#![warn(missing_docs, rustdoc::all)]
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, LitStr};
use tiny_keccak::{Hasher, Keccak};
#[proc_macro]
pub fn keccak256(tokens: TokenStream) -> TokenStream {
let mut hash = [0u8; 32];
let mut sha3 = Keccak::v256();
let to_hash = parse_macro_input!(tokens as LitStr).value();
sha3.update(to_hash.as_bytes());
sha3.finalize(&mut hash);
quote! { [#( #hash, )*] }.into()
}
#[proc_macro]
pub fn selector(tokens: TokenStream) -> TokenStream {
let mut selector = [0u8; 4];
let mut sha3 = Keccak::v256();
let to_hash = parse_macro_input!(tokens as LitStr).value();
sha3.update(to_hash.as_bytes());
sha3.finalize(&mut selector);
quote! { [#( #selector, )*] }.into()
}
#[proc_macro]
pub fn event(tokens: TokenStream) -> TokenStream {
keccak256(tokens)
}