use crate::TokenError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum TokenDataVersion {
V1 = 1u8,
V2 = 2u8,
ShaFlat = 3u8,
}
impl TokenDataVersion {
pub fn discriminator(&self) -> [u8; 8] {
match self {
TokenDataVersion::V1 => [2, 0, 0, 0, 0, 0, 0, 0], TokenDataVersion::V2 => [0, 0, 0, 0, 0, 0, 0, 3], TokenDataVersion::ShaFlat => [0, 0, 0, 0, 0, 0, 0, 4], }
}
pub fn from_discriminator(discriminator: [u8; 8]) -> Result<Self, TokenError> {
match discriminator {
[2, 0, 0, 0, 0, 0, 0, 0] => Ok(TokenDataVersion::V1), [0, 0, 0, 0, 0, 0, 0, 3] => Ok(TokenDataVersion::V2), [0, 0, 0, 0, 0, 0, 0, 4] => Ok(TokenDataVersion::ShaFlat), _ => Err(TokenError::InvalidTokenDataVersion),
}
}
pub fn serialize_amount_bytes(&self, amount: u64) -> Result<[u8; 32], TokenError> {
let mut amount_bytes = [0u8; 32];
match self {
TokenDataVersion::V1 => {
amount_bytes[24..].copy_from_slice(&amount.to_le_bytes());
}
TokenDataVersion::V2 => {
amount_bytes[24..].copy_from_slice(&amount.to_be_bytes());
}
_ => {
return Err(TokenError::InvalidTokenDataVersion);
}
}
Ok(amount_bytes)
}
}
impl TryFrom<u8> for TokenDataVersion {
type Error = crate::TokenError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
1 => Ok(TokenDataVersion::V1),
2 => Ok(TokenDataVersion::V2),
3 => Ok(TokenDataVersion::ShaFlat),
_ => Err(crate::TokenError::InvalidTokenDataVersion),
}
}
}