1use crate::common::{JournalHandler, JournalNote};
20use alloc::{collections::BTreeMap, vec};
21
22pub fn handle_journal(
24 journal: impl IntoIterator<Item = JournalNote>,
25 handler: &mut impl JournalHandler,
26) {
27 let mut page_updates = BTreeMap::new();
28 let mut exit_list = vec![];
29 let mut allocations_update = BTreeMap::new();
30
31 for note in journal {
32 match note {
33 JournalNote::MessageDispatched {
34 message_id,
35 source,
36 outcome,
37 } => handler.message_dispatched(message_id, source, outcome),
38 JournalNote::GasBurned { message_id, amount } => handler.gas_burned(message_id, amount),
39 JournalNote::ExitDispatch {
40 id_exited,
41 value_destination,
42 } => exit_list.push((id_exited, value_destination)),
43 JournalNote::MessageConsumed(message_id) => handler.message_consumed(message_id),
44 JournalNote::SendDispatch {
45 message_id,
46 dispatch,
47 delay,
48 reservation,
49 } => handler.send_dispatch(message_id, dispatch, delay, reservation),
50 JournalNote::WaitDispatch {
51 dispatch,
52 duration,
53 waited_type,
54 } => handler.wait_dispatch(dispatch, duration, waited_type),
55 JournalNote::WakeMessage {
56 message_id,
57 program_id,
58 awakening_id,
59 delay,
60 } => handler.wake_message(message_id, program_id, awakening_id, delay),
61 JournalNote::UpdatePage {
62 program_id,
63 page_number,
64 data,
65 } => {
66 let entry = page_updates.entry(program_id).or_insert_with(BTreeMap::new);
67 entry.insert(page_number, data);
68 }
69 JournalNote::UpdateAllocations {
70 program_id,
71 allocations,
72 } => {
73 allocations_update.insert(program_id, allocations);
74 }
75 JournalNote::SendValue {
76 from,
77 to,
78 value,
79 locked,
80 } => handler.send_value(from, to, value, locked),
81 JournalNote::StoreNewPrograms {
82 program_id,
83 code_id,
84 candidates,
85 } => handler.store_new_programs(program_id, code_id, candidates),
86 JournalNote::StopProcessing {
87 dispatch,
88 gas_burned,
89 } => handler.stop_processing(dispatch, gas_burned),
90 JournalNote::ReserveGas {
91 message_id,
92 reservation_id,
93 program_id,
94 amount,
95 duration: bn,
96 } => handler.reserve_gas(message_id, reservation_id, program_id, amount, bn),
97 JournalNote::UnreserveGas {
98 reservation_id,
99 program_id,
100 expiration,
101 } => handler.unreserve_gas(reservation_id, program_id, expiration),
102 JournalNote::UpdateGasReservations {
103 program_id,
104 reserver,
105 } => handler.update_gas_reservation(program_id, reserver),
106 JournalNote::SystemReserveGas { message_id, amount } => {
107 handler.system_reserve_gas(message_id, amount)
108 }
109 JournalNote::SystemUnreserveGas { message_id } => {
110 handler.system_unreserve_gas(message_id)
111 }
112 JournalNote::SendSignal {
113 message_id,
114 destination,
115 code,
116 } => handler.send_signal(message_id, destination, code),
117 JournalNote::ReplyDeposit {
118 message_id,
119 future_reply_id,
120 amount,
121 } => handler.reply_deposit(message_id, future_reply_id, amount),
122 }
123 }
124
125 for (program_id, pages_data) in page_updates {
126 handler.update_pages_data(program_id, pages_data);
127 }
128
129 for (program_id, allocations) in allocations_update {
130 handler.update_allocations(program_id, allocations);
131 }
132
133 for (id_exited, value_destination) in exit_list {
134 handler.exit_dispatch(id_exited, value_destination);
135 }
136}