1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
use proc_macro::TokenStream;
mod config;
mod errors;
mod handler;
mod store;
/// Marks function to setup substream map handler wasm boilerplate
///
/// ## Usage
///
///
/// ```rust,ignore
/// #[substreams::handlers::map]
/// fn map_handler(blk: eth::Block) -> Result<eth::TransactionTrace, substreams::error::Error> {
/// Ok(blk.transactions_traces[0])
/// }
/// ```
///
/// Equivalent code not using `#[substream::handlers::map]`
///
/// ```rust,ignore
/// #[no_mangle]
/// pub extern "C" fn map_handler(blk_ptr: *mut u8, blk_len: usize) {
/// substreams::register_panic_hook();
/// let func = || -> Result<eth::TransactionTrace, substreams::error::Error> {
/// let blk: eth::Block = substreams::proto::decode_ptr(blk_ptr, blk_len).unwrap();
/// {
/// Ok(blk.transactions_traces[0])
/// }
/// };
/// let result = func();
/// if result.is_err() {
/// panic!(result.err().unwrap())
/// }
/// substreams::output(substreams::proto::encode(result).unwrap());
/// }
/// ```
#[proc_macro_attribute]
pub fn map(args: TokenStream, item: TokenStream) -> TokenStream {
return handler::main(args, item, config::ModuleType::Map);
}
/// Marks function to setup substream store handler wasm boilerplate
/// ## Usage
///
///
/// ```rust,ignore
/// use substreams::{log, store};
///
/// #[substreams::handlers::store]
/// fn build_nft_state(transfers: erc721::Transfers, s: store::StoreAddInt64, pairs: store::Reader, tokens: store::Reader) {
/// log::info!("Length {}", transfers.len());
/// }
/// ```
///
/// Equivalent code not using `#[substream::handlers::store]`
///
/// ```rust,ignore
/// use substreams::{log, store};
///
/// #[no_mangle]
/// pub extern "C" fn build_nft_state(transfers_ptr: *mut u8, transfers_len: usize, pairs_idx: u32, tokens_idx: u32) {
/// substreams::register_panic_hook();
/// let transfers: erc721::Transfers = substreams::proto::decode_ptr(transfers_ptr, transfers_len).unwrap();
/// let pairs: store::Reader = store::Reader::new(pairs_idx);
/// let tokens: store::Reader = store::Reader::new(tokens_idx);
/// let s: store::StoreAddInt64 = store::StoreAddInt64::new();
/// {
/// log::info!("Length {}", transfers.len());
/// }
/// }
/// ```
#[proc_macro_attribute]
pub fn store(args: TokenStream, item: TokenStream) -> TokenStream {
return handler::main(args, item, config::ModuleType::Store);
}
#[proc_macro_derive(StoreWriter)]
pub fn derive(input: TokenStream) -> TokenStream {
store::main(input)
}