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 { from, to, value } => handler.send_value(from, to, value),
76 JournalNote::StoreNewPrograms {
77 program_id,
78 code_id,
79 candidates,
80 } => handler.store_new_programs(program_id, code_id, candidates),
81 JournalNote::StopProcessing {
82 dispatch,
83 gas_burned,
84 } => handler.stop_processing(dispatch, gas_burned),
85 JournalNote::ReserveGas {
86 message_id,
87 reservation_id,
88 program_id,
89 amount,
90 duration: bn,
91 } => handler.reserve_gas(message_id, reservation_id, program_id, amount, bn),
92 JournalNote::UnreserveGas {
93 reservation_id,
94 program_id,
95 expiration,
96 } => handler.unreserve_gas(reservation_id, program_id, expiration),
97 JournalNote::UpdateGasReservations {
98 program_id,
99 reserver,
100 } => handler.update_gas_reservation(program_id, reserver),
101 JournalNote::SystemReserveGas { message_id, amount } => {
102 handler.system_reserve_gas(message_id, amount)
103 }
104 JournalNote::SystemUnreserveGas { message_id } => {
105 handler.system_unreserve_gas(message_id)
106 }
107 JournalNote::SendSignal {
108 message_id,
109 destination,
110 code,
111 } => handler.send_signal(message_id, destination, code),
112 JournalNote::ReplyDeposit {
113 message_id,
114 future_reply_id,
115 amount,
116 } => handler.reply_deposit(message_id, future_reply_id, amount),
117 }
118 }
119
120 for (program_id, pages_data) in page_updates {
121 handler.update_pages_data(program_id, pages_data);
122 }
123
124 for (program_id, allocations) in allocations_update {
125 handler.update_allocations(program_id, allocations);
126 }
127
128 for (id_exited, value_destination) in exit_list {
129 handler.exit_dispatch(id_exited, value_destination);
130 }
131}