use alloc::string::String;
use core::fmt;
use core::str::FromStr;
use crate::errors::AccountIdError;
pub(super) const PUBLIC: u8 = 0b00;
pub(super) const NETWORK: u8 = 0b01;
pub(super) const PRIVATE: u8 = 0b10;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum AccountStorageMode {
Public = PUBLIC,
Network = NETWORK,
Private = PRIVATE,
}
impl AccountStorageMode {
pub fn has_public_state(&self) -> bool {
matches!(self, Self::Public | Self::Network)
}
pub fn is_public(&self) -> bool {
matches!(self, Self::Public)
}
pub fn is_network(&self) -> bool {
matches!(self, Self::Network)
}
pub fn is_private(&self) -> bool {
matches!(self, Self::Private)
}
}
impl fmt::Display for AccountStorageMode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AccountStorageMode::Public => write!(f, "public"),
AccountStorageMode::Network => write!(f, "network"),
AccountStorageMode::Private => write!(f, "private"),
}
}
}
impl TryFrom<&str> for AccountStorageMode {
type Error = AccountIdError;
fn try_from(value: &str) -> Result<Self, AccountIdError> {
match value.to_lowercase().as_str() {
"public" => Ok(AccountStorageMode::Public),
"network" => Ok(AccountStorageMode::Network),
"private" => Ok(AccountStorageMode::Private),
_ => Err(AccountIdError::UnknownAccountStorageMode(value.into())),
}
}
}
impl TryFrom<String> for AccountStorageMode {
type Error = AccountIdError;
fn try_from(value: String) -> Result<Self, AccountIdError> {
AccountStorageMode::from_str(&value)
}
}
impl FromStr for AccountStorageMode {
type Err = AccountIdError;
fn from_str(input: &str) -> Result<AccountStorageMode, AccountIdError> {
AccountStorageMode::try_from(input)
}
}
#[cfg(any(feature = "testing", test))]
impl rand::distr::Distribution<AccountStorageMode> for rand::distr::StandardUniform {
fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> AccountStorageMode {
match rng.random_range(0..3) {
0 => AccountStorageMode::Public,
1 => AccountStorageMode::Network,
2 => AccountStorageMode::Private,
_ => unreachable!("gen_range should not produce higher values"),
}
}
}