sol_parser_sdk/core/
unified_parser.rs1use crate::core::events::*;
12use smallvec::{smallvec, SmallVec};
13use solana_sdk::{pubkey::Pubkey, signature::Signature};
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]> {
40 let mut events = smallvec![]; for log in logs {
45 if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us)
46 {
47 events.push(log_event); }
49 }
51
52 events
53}
54
55#[inline] pub fn parse_logs_only(
58 logs: &[String],
59 signature: Signature,
60 slot: u64,
61 block_time_us: Option<i64>,
62) -> SmallVec<[DexEvent; 4]> {
63 let mut events = SmallVec::with_capacity(logs.len().min(4)); for log in logs {
67 if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
68 events.push(event);
69 }
70 }
71
72 events
73}
74
75pub trait EventListener {
77 fn on_dex_event(&self, event: &DexEvent);
78}
79
80pub fn parse_transaction_with_listener<T: EventListener>(
82 instruction_data: &[u8],
83 accounts: &[Pubkey],
84 logs: &[String],
85 signature: Signature,
86 slot: u64,
87 tx_index: u64,
88 block_time_us: Option<i64>,
89 program_id: &Pubkey,
90 listener: &T,
91) {
92 let events = parse_transaction_events(
93 instruction_data,
94 accounts,
95 logs,
96 signature,
97 slot,
98 tx_index,
99 block_time_us,
100 program_id,
101 );
102
103 for event in &events {
104 listener.on_dex_event(event);
105 }
106}
107
108pub fn parse_transaction_events_streaming<F>(
113 _instruction_data: &[u8],
114 _accounts: &[Pubkey],
115 logs: &[String],
116 signature: Signature,
117 slot: u64,
118 _tx_index: u64,
119 block_time_us: Option<i64>,
120 _program_id: &Pubkey,
121 mut callback: F,
122) where
123 F: FnMut(DexEvent),
124{
125 for log in logs {
134 if let Some(log_event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us)
135 {
136 callback(log_event); }
138 }
139
140 }
143
144pub fn parse_logs_streaming<F>(
146 logs: &[String],
147 signature: Signature,
148 slot: u64,
149 block_time_us: Option<i64>,
150 mut callback: F,
151) where
152 F: FnMut(DexEvent),
153{
154 for log in logs {
155 if let Some(event) = crate::logs::parse_log_unified(log, signature, slot, block_time_us) {
156 callback(event);
157 }
158 }
159}
160
161pub trait StreamingEventListener {
163 fn on_dex_event_streaming(&mut self, event: DexEvent);
164}
165
166pub fn parse_transaction_with_streaming_listener<T: StreamingEventListener>(
168 instruction_data: &[u8],
169 accounts: &[Pubkey],
170 logs: &[String],
171 signature: Signature,
172 slot: u64,
173 tx_index: u64,
174 block_time_us: Option<i64>,
175 program_id: &Pubkey,
176 listener: &mut T,
177) {
178 parse_transaction_events_streaming(
179 instruction_data,
180 accounts,
181 logs,
182 signature,
183 slot,
184 tx_index,
185 block_time_us,
186 program_id,
187 |event| listener.on_dex_event_streaming(event),
188 );
189}