use alloc::collections::BTreeMap;
use alloc::vec;
use miden_protocol::Felt;
use miden_protocol::account::{AccountComponent, AccountId, AccountProcedureRoot, RoleSymbol};
use miden_protocol::errors::AccountIdError;
pub mod authority;
pub mod ownable2step;
pub mod pausable;
pub mod rbac;
pub mod warden;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AccessControl {
Ownable2Step { owner: AccountId },
Rbac {
admin: AccountId,
roles: BTreeMap<AccountProcedureRoot, RoleSymbol>,
},
}
impl IntoIterator for AccessControl {
type Item = AccountComponent;
type IntoIter = alloc::vec::IntoIter<AccountComponent>;
fn into_iter(self) -> Self::IntoIter {
match self {
AccessControl::Ownable2Step { owner } => {
vec![Ownable2Step::new(owner).into(), Authority::OwnerControlled.into()].into_iter()
},
AccessControl::Rbac { admin, roles } => vec![
RoleBasedAccessControl::new(admin).into(),
Authority::RbacControlled { roles }.into(),
]
.into_iter(),
}
}
}
pub use authority::{Authority, AuthorityError};
pub use ownable2step::{Ownable2Step, Ownable2StepError};
pub use pausable::{Pausable, PausableManager, PausableStorage};
pub use rbac::RoleBasedAccessControl;
pub use warden::{Warden, WardenError};
pub(crate) fn account_id_from_felt_pair(
suffix: Felt,
prefix: Felt,
) -> Result<Option<AccountId>, AccountIdError> {
if suffix == Felt::ZERO && prefix == Felt::ZERO {
Ok(None)
} else {
AccountId::try_from_elements(suffix, prefix).map(Some)
}
}