use miden_protocol::account::component::{AccountComponentCode, AccountComponentMetadata};
use miden_protocol::account::{AccountComponent, AccountProcedureRoot};
use crate::account::account_component_code;
use crate::procedure_root;
account_component_code!(PAUSABLE_MANAGER_CODE, "access/pausable/manager.masl");
procedure_root!(
PAUSABLE_MANAGER_PAUSE,
PausableManager::NAME,
PausableManager::PAUSE_PROC_NAME,
PausableManager::code()
);
procedure_root!(
PAUSABLE_MANAGER_UNPAUSE,
PausableManager::NAME,
PausableManager::UNPAUSE_PROC_NAME,
PausableManager::code()
);
#[derive(Debug, Clone, Copy, Default)]
pub struct PausableManager;
impl PausableManager {
pub const NAME: &'static str = "miden::standards::components::access::pausable::manager";
pub const PAUSE_PROC_NAME: &'static str = "pause";
pub const UNPAUSE_PROC_NAME: &'static str = "unpause";
pub fn code() -> &'static AccountComponentCode {
&PAUSABLE_MANAGER_CODE
}
pub fn pause_root() -> AccountProcedureRoot {
*PAUSABLE_MANAGER_PAUSE
}
pub fn unpause_root() -> AccountProcedureRoot {
*PAUSABLE_MANAGER_UNPAUSE
}
}
impl From<PausableManager> for AccountComponent {
fn from(_: PausableManager) -> Self {
let metadata = AccountComponentMetadata::new(PausableManager::NAME).with_description(
"PausableManager: pause / unpause admin procedures gated by the account-wide \
Authority component. Requires the Pausable companion component for storage and the \
Authority component for auth dispatch.",
);
AccountComponent::new(PausableManager::code().clone(), vec![], metadata).expect(
"pausable manager component should satisfy the requirements of a valid account component",
)
}
}