sol_parser_sdk/core/
unified_parser.rs1use crate::core::events::*;
12use solana_sdk::{pubkey::Pubkey, signature::Signature};
13use smallvec::{SmallVec, smallvec};
14
15#[inline] pub fn parse_transaction_events(
31 _instruction_data: &[u8],
32 _accounts: &[Pubkey],
33 logs: &[String],
34 signature: Signature,
35 slot: u64,
36 _tx_index: u64,
37 block_time_us: Option<i64>,
38 _program_id: &Pubkey,
39) -> SmallVec<[DexEvent; 4]> { let mut events = smallvec![]; for log in logs {
44 if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
45 events.push(log_event); }
47 }
49
50 events
51}
52
53#[inline] pub fn parse_logs_only(
56 logs: &[String],
57 signature: Signature,
58 slot: u64,
59 block_time_us: Option<i64>,
60) -> SmallVec<[DexEvent; 4]> { let mut events = SmallVec::with_capacity(logs.len().min(4)); for log in logs {
64 if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
65 events.push(event);
66 }
67 }
68
69 events
70}
71
72pub trait EventListener {
74 fn on_dex_event(&self, event: &DexEvent);
75}
76
77pub fn parse_transaction_with_listener<T: EventListener>(
79 instruction_data: &[u8],
80 accounts: &[Pubkey],
81 logs: &[String],
82 signature: Signature,
83 slot: u64,
84 tx_index: u64,
85 block_time_us: Option<i64>,
86 program_id: &Pubkey,
87 listener: &T,
88) {
89 let events = parse_transaction_events(
90 instruction_data, accounts, logs, signature, slot, tx_index, block_time_us, program_id
91 );
92
93 for event in &events {
94 listener.on_dex_event(event);
95 }
96}
97
98pub fn parse_transaction_events_streaming<F>(
103 _instruction_data: &[u8],
104 _accounts: &[Pubkey],
105 logs: &[String],
106 signature: Signature,
107 slot: u64,
108 _tx_index: u64,
109 block_time_us: Option<i64>,
110 _program_id: &Pubkey,
111 mut callback: F,
112) where
113 F: FnMut(DexEvent)
114{
115 for log in logs {
124 if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
125 callback(log_event); }
127 }
128
129 }
132
133pub fn parse_logs_streaming<F>(
135 logs: &[String],
136 signature: Signature,
137 slot: u64,
138 block_time_us: Option<i64>,
139 mut callback: F,
140) where
141 F: FnMut(DexEvent)
142{
143 for log in logs {
144 if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
145 callback(event);
146 }
147 }
148}
149
150pub trait StreamingEventListener {
152 fn on_dex_event_streaming(&mut self, event: DexEvent);
153}
154
155pub fn parse_transaction_with_streaming_listener<T: StreamingEventListener>(
157 instruction_data: &[u8],
158 accounts: &[Pubkey],
159 logs: &[String],
160 signature: Signature,
161 slot: u64,
162 tx_index: u64,
163 block_time_us: Option<i64>,
164 program_id: &Pubkey,
165 listener: &mut T,
166) {
167 parse_transaction_events_streaming(
168 instruction_data,
169 accounts,
170 logs,
171 signature,
172 slot,
173 tx_index,
174 block_time_us,
175 program_id,
176 |event| listener.on_dex_event_streaming(event)
177 );
178}