use crate::core::events::*;
use smallvec::{smallvec, SmallVec};
use solana_sdk::{pubkey::Pubkey, signature::Signature};
#[inline] pub fn parse_transaction_events(
_instruction_data: &[u8],
_accounts: &[Pubkey],
logs: &[String],
signature: Signature,
slot: u64,
_tx_index: u64,
block_time_us: Option<i64>,
_program_id: &Pubkey,
) -> SmallVec<[DexEvent; 4]> {
let mut events = smallvec![];
for log in logs {
if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us)
{
events.push(log_event); }
}
events
}
#[inline] pub fn parse_logs_only(
logs: &[String],
signature: Signature,
slot: u64,
block_time_us: Option<i64>,
) -> SmallVec<[DexEvent; 4]> {
let mut events = SmallVec::with_capacity(logs.len().min(4));
for log in logs {
if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
events.push(event);
}
}
events
}
pub trait EventListener {
fn on_dex_event(&self, event: &DexEvent);
}
pub fn parse_transaction_with_listener<T: EventListener>(
instruction_data: &[u8],
accounts: &[Pubkey],
logs: &[String],
signature: Signature,
slot: u64,
tx_index: u64,
block_time_us: Option<i64>,
program_id: &Pubkey,
listener: &T,
) {
let events = parse_transaction_events(
instruction_data,
accounts,
logs,
signature,
slot,
tx_index,
block_time_us,
program_id,
);
for event in &events {
listener.on_dex_event(event);
}
}
pub fn parse_transaction_events_streaming<F>(
_instruction_data: &[u8],
_accounts: &[Pubkey],
logs: &[String],
signature: Signature,
slot: u64,
_tx_index: u64,
block_time_us: Option<i64>,
_program_id: &Pubkey,
mut callback: F,
) where
F: FnMut(DexEvent),
{
for log in logs {
if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us)
{
callback(log_event); }
}
}
pub fn parse_logs_streaming<F>(
logs: &[String],
signature: Signature,
slot: u64,
block_time_us: Option<i64>,
mut callback: F,
) where
F: FnMut(DexEvent),
{
for log in logs {
if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
callback(event);
}
}
}
pub trait StreamingEventListener {
fn on_dex_event_streaming(&mut self, event: DexEvent);
}
pub fn parse_transaction_with_streaming_listener<T: StreamingEventListener>(
instruction_data: &[u8],
accounts: &[Pubkey],
logs: &[String],
signature: Signature,
slot: u64,
tx_index: u64,
block_time_us: Option<i64>,
program_id: &Pubkey,
listener: &mut T,
) {
parse_transaction_events_streaming(
instruction_data,
accounts,
logs,
signature,
slot,
tx_index,
block_time_us,
program_id,
|event| listener.on_dex_event_streaming(event),
);
}