/// Macro to generate boilerplate EventParser implementation for protocol parsers /// /// This macro eliminates the repetitive code where each parser simply delegates /// all EventParser trait methods to its inner GenericEventParser. /// /// Usage: /// ```rust /// impl_event_parser_delegate!(MyEventParser); /// ``` /// /// This will generate the complete EventParser implementation that delegates /// all methods to `self.inner`. #[macro_export] macro_rules! impl_event_parser_delegate { ($parser_type:ty) => { #[async_trait::async_trait] impl $crate::streaming::event_parser::core::traits::EventParser for $parser_type { fn instruction_configs( &self, ) -> std::collections::HashMap< Vec, Vec<$crate::streaming::event_parser::core::traits::GenericEventParseConfig>, > { self.inner.instruction_configs() } fn parse_events_from_inner_instruction( &self, inner_instruction: &solana_sdk::instruction::CompiledInstruction, signature: solana_sdk::signature::Signature, slot: u64, block_time: Option, recv_us: i64, outer_index: i64, inner_index: Option, transaction_index: Option, config: &GenericEventParseConfig, ) -> Vec> { self.inner.parse_events_from_inner_instruction( inner_instruction, signature, slot, block_time, recv_us, outer_index, inner_index, transaction_index, config, ) } fn parse_events_from_grpc_inner_instruction( &self, inner_instruction: &yellowstone_grpc_proto::prelude::InnerInstruction, signature: solana_sdk::signature::Signature, slot: u64, block_time: Option, recv_us: i64, outer_index: i64, inner_index: Option, transaction_index: Option, config: &GenericEventParseConfig, ) -> Vec> { self.inner.parse_events_from_grpc_inner_instruction(inner_instruction, signature, slot, block_time, recv_us, outer_index, inner_index, transaction_index, config) } fn parse_events_from_instruction( &self, instruction: &solana_sdk::instruction::CompiledInstruction, accounts: &[solana_sdk::pubkey::Pubkey], signature: solana_sdk::signature::Signature, slot: u64, block_time: Option, recv_us: i64, outer_index: i64, inner_index: Option, bot_wallet: Option, transaction_index: Option, inner_instructions: Option<&solana_transaction_status::InnerInstructions>, callback: std::sync::Arc< dyn for<'a> Fn(&'a Box) + Send + Sync, >, ) -> anyhow::Result<()> { self.inner.parse_events_from_instruction( instruction, accounts, signature, slot, block_time, recv_us, outer_index, inner_index, bot_wallet, transaction_index, inner_instructions, callback, ) } fn parse_events_from_grpc_instruction( &self, instruction: &yellowstone_grpc_proto::prelude::CompiledInstruction, accounts: &[solana_sdk::pubkey::Pubkey], signature: solana_sdk::signature::Signature, slot: u64, block_time: Option, recv_us: i64, outer_index: i64, inner_index: Option, bot_wallet: Option, transaction_index: Option, inner_instructions: Option<&yellowstone_grpc_proto::prelude::InnerInstructions>, callback: std::sync::Arc< dyn for<'a> Fn(&'a Box) + Send + Sync, >, ) -> anyhow::Result<()> { self.inner.parse_events_from_grpc_instruction(instruction, accounts, signature, slot, block_time, recv_us, outer_index, inner_index, bot_wallet, transaction_index, inner_instructions, callback) } fn should_handle(&self, program_id: &solana_sdk::pubkey::Pubkey) -> bool { self.inner.should_handle(program_id) } fn supported_program_ids(&self) -> Vec { self.inner.supported_program_ids() } } }; }