1use crate::ids::{ActorId, MessageId, ReservationId};
7use gsys::Gas;
8use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
9use scale_decode::DecodeAsType;
10use scale_encode::EncodeAsType;
11use scale_info::TypeInfo;
12
13pub type VaraScheduledTask<AccountId> = ScheduledTask<AccountId, MessageId, bool>;
15
16#[derive(
22 Copy,
23 Clone,
24 Debug,
25 Eq,
26 PartialEq,
27 PartialOrd,
28 Ord,
29 Hash,
30 Encode,
31 EncodeAsType,
32 Decode,
33 DecodeAsType,
34 TypeInfo,
35 MaxEncodedLen,
36)]
37pub enum ScheduledTask<RFM, SD, SUM> {
38 RemoveFromMailbox(RFM, MessageId),
40
41 RemoveFromWaitlist(ActorId, MessageId),
43
44 WakeMessage(ActorId, MessageId),
48
49 SendDispatch(SD),
53
54 SendUserMessage {
58 message_id: MessageId,
60 to_mailbox: SUM,
62 },
63
64 RemoveGasReservation(ActorId, ReservationId),
66}
67
68impl<RFM, SD, SUM> ScheduledTask<RFM, SD, SUM> {
69 pub fn process_with(self, handler: &mut impl TaskHandler<RFM, SD, SUM>) -> Gas {
71 use ScheduledTask::*;
72
73 match self {
74 RemoveFromMailbox(user_id, message_id) => {
75 handler.remove_from_mailbox(user_id, message_id)
76 }
77 RemoveFromWaitlist(program_id, message_id) => {
78 handler.remove_from_waitlist(program_id, message_id)
79 }
80 WakeMessage(program_id, message_id) => handler.wake_message(program_id, message_id),
81 SendDispatch(message_id) => handler.send_dispatch(message_id),
82 SendUserMessage {
83 message_id,
84 to_mailbox,
85 } => handler.send_user_message(message_id, to_mailbox),
86 RemoveGasReservation(program_id, reservation_id) => {
87 handler.remove_gas_reservation(program_id, reservation_id)
88 }
89 }
90 }
91}
92
93pub trait TaskHandler<RFM, SD, SUM> {
95 fn remove_from_mailbox(&mut self, user_id: RFM, message_id: MessageId) -> Gas;
99 fn remove_from_waitlist(&mut self, program_id: ActorId, message_id: MessageId) -> Gas;
101
102 fn wake_message(&mut self, program_id: ActorId, message_id: MessageId) -> Gas;
106
107 fn send_dispatch(&mut self, stashed_message_id: SD) -> Gas;
109
110 fn send_user_message(&mut self, stashed_message_id: MessageId, to_mailbox: SUM) -> Gas;
112
113 fn remove_gas_reservation(&mut self, program_id: ActorId, reservation_id: ReservationId)
115 -> Gas;
116}
117
118#[test]
119fn task_encoded_size() {
120 const MAX_SIZE: usize = 256;
122
123 assert!(VaraScheduledTask::<ActorId>::max_encoded_len() <= MAX_SIZE);
125}