use crate::ids::{ActorId, MessageId, ReservationId};
use gsys::Gas;
use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
use scale_decode::DecodeAsType;
use scale_encode::EncodeAsType;
use scale_info::TypeInfo;
pub type VaraScheduledTask<AccountId> = ScheduledTask<AccountId, MessageId, bool>;
#[derive(
Copy,
Clone,
Debug,
Eq,
PartialEq,
PartialOrd,
Ord,
Hash,
Encode,
EncodeAsType,
Decode,
DecodeAsType,
TypeInfo,
MaxEncodedLen,
)]
pub enum ScheduledTask<RFM, SD, SUM> {
RemoveFromMailbox(RFM, MessageId),
RemoveFromWaitlist(ActorId, MessageId),
WakeMessage(ActorId, MessageId),
SendDispatch(SD),
SendUserMessage {
message_id: MessageId,
to_mailbox: SUM,
},
RemoveGasReservation(ActorId, ReservationId),
}
impl<RFM, SD, SUM> ScheduledTask<RFM, SD, SUM> {
pub fn process_with(self, handler: &mut impl TaskHandler<RFM, SD, SUM>) -> Gas {
use ScheduledTask::*;
match self {
RemoveFromMailbox(user_id, message_id) => {
handler.remove_from_mailbox(user_id, message_id)
}
RemoveFromWaitlist(program_id, message_id) => {
handler.remove_from_waitlist(program_id, message_id)
}
WakeMessage(program_id, message_id) => handler.wake_message(program_id, message_id),
SendDispatch(message_id) => handler.send_dispatch(message_id),
SendUserMessage {
message_id,
to_mailbox,
} => handler.send_user_message(message_id, to_mailbox),
RemoveGasReservation(program_id, reservation_id) => {
handler.remove_gas_reservation(program_id, reservation_id)
}
}
}
}
pub trait TaskHandler<RFM, SD, SUM> {
fn remove_from_mailbox(&mut self, user_id: RFM, message_id: MessageId) -> Gas;
fn remove_from_waitlist(&mut self, program_id: ActorId, message_id: MessageId) -> Gas;
fn wake_message(&mut self, program_id: ActorId, message_id: MessageId) -> Gas;
fn send_dispatch(&mut self, stashed_message_id: SD) -> Gas;
fn send_user_message(&mut self, stashed_message_id: MessageId, to_mailbox: SUM) -> Gas;
fn remove_gas_reservation(&mut self, program_id: ActorId, reservation_id: ReservationId)
-> Gas;
}
#[test]
fn task_encoded_size() {
const MAX_SIZE: usize = 256;
assert!(VaraScheduledTask::<ActorId>::max_encoded_len() <= MAX_SIZE);
}