use super::{scheduler::StorageType, *};
pub use gear_core::gas::LockId;
#[derive(Debug)]
pub struct TryFromStorageTypeError;
impl fmt::Display for TryFromStorageTypeError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "Corresponding enum variant not found")
}
}
impl TryFrom<StorageType> for LockId {
type Error = TryFromStorageTypeError;
fn try_from(storage: StorageType) -> Result<Self, Self::Error> {
match storage {
StorageType::Mailbox => Ok(Self::Mailbox),
StorageType::Waitlist => Ok(Self::Waitlist),
StorageType::Reservation => Ok(Self::Reservation),
StorageType::DispatchStash => Ok(Self::DispatchStash),
_ => Err(TryFromStorageTypeError),
}
}
}
pub trait LockableTree: Tree {
fn lock(
key: impl Into<Self::NodeId>,
id: LockId,
amount: Self::Balance,
) -> Result<(), Self::Error>;
fn unlock(
key: impl Into<Self::NodeId>,
id: LockId,
amount: Self::Balance,
) -> Result<(), Self::Error>;
fn unlock_all(key: impl Into<Self::NodeId>, id: LockId) -> Result<Self::Balance, Self::Error> {
let key = key.into();
let amount = Self::get_lock(key.clone(), id)?;
Self::unlock(key, id, amount.clone()).map(|_| amount)
}
fn get_lock(key: impl Into<Self::NodeId>, id: LockId) -> Result<Self::Balance, Self::Error>;
}
#[test]
fn lock_id_enum_discriminants_are_consistent() {
assert_eq!(0, LockId::Mailbox as usize);
assert_eq!(1, LockId::Waitlist as usize);
assert_eq!(2, LockId::Reservation as usize);
assert_eq!(3, LockId::DispatchStash as usize);
}