use crate::{self as casper_contract_sdk, casper, casper::Entity, macros::casper};
#[casper]
pub struct PausedState {
paused: bool,
}
#[casper(path = crate)]
pub enum PausableError {
EnforcedPause,
ExpectedPause,
}
#[casper(message, path = crate)]
pub struct Paused {
entity: Entity,
}
#[casper(message, path = crate)]
pub struct Unpaused {
entity: Entity,
}
#[casper(path = crate, export = true)]
pub trait Pausable {
#[casper(private)]
fn state(&self) -> &PausedState;
#[casper(private)]
fn state_mut(&mut self) -> &mut PausedState;
#[casper(private)]
fn paused(&self) -> bool {
self.state().paused
}
#[casper(private)]
fn pause(&mut self) -> Result<(), PausableError> {
self.enforce_unpaused()?;
self.state_mut().paused = true;
casper::emit(Paused {
entity: casper::get_caller(),
})
.expect("Emit");
Ok(())
}
#[casper(private)]
fn unpause(&mut self) -> Result<(), PausableError> {
self.enforce_paused()?;
self.state_mut().paused = false;
casper::emit(Unpaused {
entity: casper::get_caller(),
})
.expect("Emit");
Ok(())
}
#[casper(private)]
fn enforce_paused(&self) -> Result<(), PausableError> {
if self.paused() {
Ok(())
} else {
Err(PausableError::ExpectedPause)
}
}
#[casper(private)]
fn enforce_unpaused(&self) -> Result<(), PausableError> {
if !self.paused() {
Ok(())
} else {
Err(PausableError::EnforcedPause)
}
}
}