use crate::blocks::BlocksManager;
use gear_common::{
auxiliary::mailbox::*,
storage::{GetCallback, Interval, IterableByKeyMap, Mailbox, MailboxCallbacks},
};
use gear_core::ids::{MessageId, ProgramId};
#[derive(Debug, Default)]
pub(crate) struct MailboxManager;
impl MailboxManager {
pub(crate) fn insert(&self, message: MailboxedMessage) -> Result<(), MailboxErrorImpl> {
<AuxiliaryMailbox<MailboxCallbacksImpl> as Mailbox>::insert(message, u32::MAX)
}
pub(crate) fn remove(
&self,
user: ProgramId,
reply_to: MessageId,
) -> Result<(MailboxedMessage, Interval<BlockNumber>), MailboxErrorImpl> {
<AuxiliaryMailbox<MailboxCallbacksImpl> as Mailbox>::remove(user, reply_to)
}
pub(crate) fn iter_key(
&self,
to: ProgramId,
) -> impl Iterator<Item = (MailboxedMessage, Interval<BlockNumber>)> {
<AuxiliaryMailbox<MailboxCallbacksImpl> as IterableByKeyMap<_>>::iter_key(to)
}
pub(crate) fn reset(&self) {
<AuxiliaryMailbox<MailboxCallbacksImpl> as Mailbox>::clear();
}
}
pub(crate) struct MailboxCallbacksImpl;
impl MailboxCallbacks<MailboxErrorImpl> for MailboxCallbacksImpl {
type Value = MailboxedMessage;
type BlockNumber = BlockNumber;
type GetBlockNumber = GetBlockNumberImpl;
type OnInsert = ();
type OnRemove = ();
}
pub(crate) struct GetBlockNumberImpl;
impl GetCallback<BlockNumber> for GetBlockNumberImpl {
fn call() -> BlockNumber {
BlocksManager::new().get().height
}
}