use crate::ids::{CodeId, MessageId, ProgramId, ReservationId};
use gsys::Gas;
use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
use scale_info::TypeInfo;
pub type VaraScheduledTask<AccountId> = ScheduledTask<AccountId, MessageId, bool>;
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Encode, Decode, TypeInfo, MaxEncodedLen)]
pub enum ScheduledTask<RFM, SD, SUM> {
#[codec(index = 0)]
PauseProgram(ProgramId),
#[codec(index = 1)]
RemoveCode(CodeId),
#[codec(index = 2)]
RemoveFromMailbox(RFM, MessageId),
#[codec(index = 3)]
RemoveFromWaitlist(ProgramId, MessageId),
#[codec(index = 4)]
RemovePausedProgram(ProgramId),
#[codec(index = 5)]
WakeMessage(ProgramId, MessageId),
#[codec(index = 6)]
SendDispatch(SD),
#[codec(index = 7)]
SendUserMessage {
message_id: MessageId,
to_mailbox: SUM,
},
#[codec(index = 8)]
RemoveGasReservation(ProgramId, ReservationId),
#[codec(index = 9)]
#[deprecated = "Paused program storage was removed in pallet-gear-program"]
RemoveResumeSession(u32),
}
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 {
PauseProgram(program_id) => handler.pause_program(program_id),
RemoveCode(code_id) => handler.remove_code(code_id),
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)
}
RemovePausedProgram(program_id) => handler.remove_paused_program(program_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)
}
#[allow(deprecated)]
RemoveResumeSession(session_id) => handler.remove_resume_session(session_id),
}
}
}
pub trait TaskHandler<RFM, SD, SUM> {
fn pause_program(&mut self, program_id: ProgramId) -> Gas;
fn remove_code(&mut self, code_id: CodeId) -> Gas;
fn remove_from_mailbox(&mut self, user_id: RFM, message_id: MessageId) -> Gas;
fn remove_from_waitlist(&mut self, program_id: ProgramId, message_id: MessageId) -> Gas;
fn remove_paused_program(&mut self, program_id: ProgramId) -> Gas;
fn wake_message(&mut self, program_id: ProgramId, 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: ProgramId,
reservation_id: ReservationId,
) -> Gas;
fn remove_resume_session(&mut self, session_id: u32) -> Gas;
}
#[test]
fn task_encoded_size() {
const MAX_SIZE: usize = 256;
assert!(VaraScheduledTask::<ProgramId>::max_encoded_len() <= MAX_SIZE);
}