#[allow(deprecated)]
use super::PreimageProvider;
use alloc::vec::Vec;
use codec::{Codec, Decode, DecodeWithMemTracking, Encode, EncodeLike, MaxEncodedLen};
use core::{fmt::Debug, result::Result};
use scale_info::TypeInfo;
use subsoil::runtime::{traits::Saturating, DispatchError};
pub type Period<BlockNumber> = (BlockNumber, u32);
pub type Priority = u8;
#[derive(
Encode,
Decode,
DecodeWithMemTracking,
Copy,
Clone,
PartialEq,
Eq,
Debug,
TypeInfo,
MaxEncodedLen,
)]
pub enum DispatchTime<BlockNumber> {
At(BlockNumber),
After(BlockNumber),
}
impl<BlockNumber: Saturating + Copy> DispatchTime<BlockNumber> {
pub fn evaluate(&self, since: BlockNumber) -> BlockNumber {
match &self {
Self::At(m) => *m,
Self::After(m) => m.saturating_add(since),
}
}
}
pub const HIGHEST_PRIORITY: Priority = 0;
pub const HARD_DEADLINE: Priority = 63;
pub const LOWEST_PRIORITY: Priority = 255;
#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]
pub enum MaybeHashed<T, Hash> {
Value(T),
Hash(Hash),
}
impl<T, H> From<T> for MaybeHashed<T, H> {
fn from(t: T) -> Self {
MaybeHashed::Value(t)
}
}
#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]
pub enum LookupError {
Unknown,
BadFormat,
}
impl<T: Decode, H> MaybeHashed<T, H> {
pub fn as_value(&self) -> Option<&T> {
match &self {
Self::Value(c) => Some(c),
Self::Hash(_) => None,
}
}
pub fn as_hash(&self) -> Option<&H> {
match &self {
Self::Value(_) => None,
Self::Hash(h) => Some(h),
}
}
pub fn ensure_requested<P: PreimageProvider<H>>(&self) {
match &self {
Self::Value(_) => (),
Self::Hash(hash) => P::request_preimage(hash),
}
}
pub fn ensure_unrequested<P: PreimageProvider<H>>(&self) {
match &self {
Self::Value(_) => (),
Self::Hash(hash) => P::unrequest_preimage(hash),
}
}
pub fn resolved<P: PreimageProvider<H>>(self) -> (Self, Option<H>) {
match self {
Self::Value(c) => (Self::Value(c), None),
Self::Hash(h) => {
let data = match P::get_preimage(&h) {
Some(p) => p,
None => return (Self::Hash(h), None),
};
match T::decode(&mut &data[..]) {
Ok(c) => (Self::Value(c), Some(h)),
Err(_) => (Self::Hash(h), None),
}
},
}
}
}
#[deprecated(note = "Use `v3` instead. Will be removed after September 2024.")]
pub mod v1 {
use super::*;
pub trait Anon<BlockNumber, Call, RuntimeOrigin> {
type Address: Codec + Clone + Eq + EncodeLike + Debug + TypeInfo + MaxEncodedLen;
fn schedule(
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: RuntimeOrigin,
call: Call,
) -> Result<Self::Address, DispatchError>;
fn cancel(address: Self::Address) -> Result<(), ()>;
fn reschedule(
address: Self::Address,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError>;
fn next_dispatch_time(address: Self::Address) -> Result<BlockNumber, ()>;
}
pub trait Named<BlockNumber, Call, RuntimeOrigin> {
type Address: Codec + Clone + Eq + EncodeLike + core::fmt::Debug + MaxEncodedLen;
fn schedule_named(
id: Vec<u8>,
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: RuntimeOrigin,
call: Call,
) -> Result<Self::Address, ()>;
fn cancel_named(id: Vec<u8>) -> Result<(), ()>;
fn reschedule_named(
id: Vec<u8>,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError>;
fn next_dispatch_time(id: Vec<u8>) -> Result<BlockNumber, ()>;
}
#[allow(deprecated)]
impl<T, BlockNumber, Call, RuntimeOrigin> Anon<BlockNumber, Call, RuntimeOrigin> for T
where
T: v2::Anon<BlockNumber, Call, RuntimeOrigin>,
{
#[allow(deprecated)]
type Address = T::Address;
fn schedule(
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: RuntimeOrigin,
call: Call,
) -> Result<Self::Address, DispatchError> {
let c = MaybeHashed::<Call, T::Hash>::Value(call);
#[allow(deprecated)]
T::schedule(when, maybe_periodic, priority, origin, c)
}
fn cancel(address: Self::Address) -> Result<(), ()> {
#[allow(deprecated)]
T::cancel(address)
}
fn reschedule(
address: Self::Address,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError> {
#[allow(deprecated)]
T::reschedule(address, when)
}
fn next_dispatch_time(address: Self::Address) -> Result<BlockNumber, ()> {
#[allow(deprecated)]
T::next_dispatch_time(address)
}
}
#[allow(deprecated)]
impl<T, BlockNumber, Call, RuntimeOrigin> Named<BlockNumber, Call, RuntimeOrigin> for T
where
T: v2::Named<BlockNumber, Call, RuntimeOrigin>,
{
#[allow(deprecated)]
type Address = T::Address;
fn schedule_named(
id: Vec<u8>,
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: RuntimeOrigin,
call: Call,
) -> Result<Self::Address, ()> {
let c = MaybeHashed::<Call, T::Hash>::Value(call);
#[allow(deprecated)]
T::schedule_named(id, when, maybe_periodic, priority, origin, c)
}
fn cancel_named(id: Vec<u8>) -> Result<(), ()> {
#[allow(deprecated)]
T::cancel_named(id)
}
fn reschedule_named(
id: Vec<u8>,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError> {
#[allow(deprecated)]
T::reschedule_named(id, when)
}
fn next_dispatch_time(id: Vec<u8>) -> Result<BlockNumber, ()> {
#[allow(deprecated)]
T::next_dispatch_time(id)
}
}
}
#[deprecated(note = "Use `v3` instead. Will be removed after September 2024.")]
pub mod v2 {
use super::*;
pub trait Anon<BlockNumber, Call, RuntimeOrigin> {
type Address: Codec + Clone + Eq + EncodeLike + Debug + TypeInfo + MaxEncodedLen;
type Hash;
fn schedule(
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: RuntimeOrigin,
call: MaybeHashed<Call, Self::Hash>,
) -> Result<Self::Address, DispatchError>;
fn cancel(address: Self::Address) -> Result<(), ()>;
fn reschedule(
address: Self::Address,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError>;
fn next_dispatch_time(address: Self::Address) -> Result<BlockNumber, ()>;
}
pub trait Named<BlockNumber, Call, RuntimeOrigin> {
type Address: Codec + Clone + Eq + EncodeLike + core::fmt::Debug + MaxEncodedLen;
type Hash;
fn schedule_named(
id: Vec<u8>,
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: RuntimeOrigin,
call: MaybeHashed<Call, Self::Hash>,
) -> Result<Self::Address, ()>;
fn cancel_named(id: Vec<u8>) -> Result<(), ()>;
fn reschedule_named(
id: Vec<u8>,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError>;
fn next_dispatch_time(id: Vec<u8>) -> Result<BlockNumber, ()>;
}
}
pub mod v3 {
use super::*;
use crate::traits::Bounded;
pub trait Anon<BlockNumber, Call, Origin> {
type Address: Codec + MaxEncodedLen + Clone + Eq + EncodeLike + Debug + TypeInfo;
type Hasher: subsoil::runtime::traits::Hash;
fn schedule(
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: Origin,
call: Bounded<Call, Self::Hasher>,
) -> Result<Self::Address, DispatchError>;
fn cancel(address: Self::Address) -> Result<(), DispatchError>;
fn reschedule(
address: Self::Address,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError>;
fn next_dispatch_time(address: Self::Address) -> Result<BlockNumber, DispatchError>;
}
pub type TaskName = [u8; 32];
pub trait Named<BlockNumber, Call, Origin> {
type Address: Codec + MaxEncodedLen + Clone + Eq + EncodeLike + core::fmt::Debug;
type Hasher: subsoil::runtime::traits::Hash;
fn schedule_named(
id: TaskName,
when: DispatchTime<BlockNumber>,
maybe_periodic: Option<Period<BlockNumber>>,
priority: Priority,
origin: Origin,
call: Bounded<Call, Self::Hasher>,
) -> Result<Self::Address, DispatchError>;
fn cancel_named(id: TaskName) -> Result<(), DispatchError>;
fn reschedule_named(
id: TaskName,
when: DispatchTime<BlockNumber>,
) -> Result<Self::Address, DispatchError>;
fn next_dispatch_time(id: TaskName) -> Result<BlockNumber, DispatchError>;
}
}
#[allow(deprecated)]
pub use v1::*;