pub use crate::{
pausable,
traits::pausable::*,
};
pub use pausable::Internal as _;
use openbrush::{
modifier_definition,
modifiers,
traits::{
AccountId,
Storage,
},
};
pub const STORAGE_KEY: u32 = openbrush::storage_unique_key!(Data);
#[derive(Default, Debug)]
#[openbrush::upgradeable_storage(STORAGE_KEY)]
pub struct Data {
pub paused: bool,
pub _reserved: Option<()>,
}
#[modifier_definition]
pub fn when_paused<T, F, R, E>(instance: &mut T, body: F) -> Result<R, E>
where
T: Storage<Data>,
F: FnOnce(&mut T) -> Result<R, E>,
E: From<PausableError>,
{
if !instance.data().paused {
return Err(From::from(PausableError::NotPaused))
}
body(instance)
}
#[modifier_definition]
pub fn when_not_paused<T, F, R, E>(instance: &mut T, body: F) -> Result<R, E>
where
T: Storage<Data>,
F: FnOnce(&mut T) -> Result<R, E>,
E: From<PausableError>,
{
if instance.data().paused {
return Err(From::from(PausableError::Paused))
}
body(instance)
}
impl<T: Storage<Data>> Pausable for T {
default fn paused(&self) -> bool {
self.data().paused
}
}
pub trait Internal {
fn _emit_paused_event(&self, _account: AccountId);
fn _emit_unpaused_event(&self, _account: AccountId);
#[modifiers(when_not_paused)]
fn _pause<E: From<PausableError>>(&mut self) -> Result<(), E>;
#[modifiers(when_paused)]
fn _unpause<E: From<PausableError>>(&mut self) -> Result<(), E>;
fn _switch_pause<E: From<PausableError>>(&mut self) -> Result<(), E>;
}
impl<T: Storage<Data>> Internal for T {
default fn _emit_paused_event(&self, _account: AccountId) {}
default fn _emit_unpaused_event(&self, _account: AccountId) {}
#[modifiers(when_not_paused)]
default fn _pause<E: From<PausableError>>(&mut self) -> Result<(), E> {
self.data().paused = true;
self._emit_paused_event(Self::env().caller());
Ok(())
}
#[modifiers(when_paused)]
default fn _unpause<E: From<PausableError>>(&mut self) -> Result<(), E> {
self.data().paused = false;
self._emit_unpaused_event(Self::env().caller());
Ok(())
}
default fn _switch_pause<E: From<PausableError>>(&mut self) -> Result<(), E> {
if self.paused() {
self._unpause()
} else {
self._pause()
}
}
}