radix-engine 1.3.1

Reference implementation of Radix Engine, from the Radix DLT project.
Documentation
use radix_common::ScryptoSbor;

#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
#[repr(u8)]
pub enum ScryptoVmVersion {
    V1_0,
    V1_1,
    V1_2,
}

impl ScryptoVmVersion {
    pub const fn latest() -> ScryptoVmVersion {
        Self::cuttlefish()
    }

    pub const fn babylon_genesis() -> ScryptoVmVersion {
        Self::V1_0
    }

    pub const fn anemone() -> ScryptoVmVersion {
        Self::V1_1
    }

    pub const fn cuttlefish() -> ScryptoVmVersion {
        Self::V1_2
    }

    pub const fn crypto_utils_v1() -> ScryptoVmVersion {
        Self::V1_1
    }

    pub const fn crypto_utils_v2() -> ScryptoVmVersion {
        Self::V1_2
    }
}

impl From<ScryptoVmVersion> for u64 {
    fn from(version: ScryptoVmVersion) -> Self {
        version as u64
    }
}

impl TryFrom<u64> for ScryptoVmVersion {
    type Error = ScryptoVmVersionError;

    fn try_from(version: u64) -> Result<Self, Self::Error> {
        match version {
            0 => Ok(Self::V1_0),
            1 => Ok(Self::V1_1),
            2 => Ok(Self::V1_2),
            v => Err(Self::Error::FromIntError(v)),
        }
    }
}

#[derive(Debug, Clone, Eq, PartialEq, ScryptoSbor)]
pub enum ScryptoVmVersionError {
    FromIntError(u64),
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_scrypto_vm_version() {
        let v = ScryptoVmVersion::latest();
        assert_eq!(v, ScryptoVmVersion::V1_2);
        assert_eq!(ScryptoVmVersion::crypto_utils_v1(), ScryptoVmVersion::V1_1);
    }

    #[test]
    fn test_scrypto_vm_version_conversions() {
        let v: u64 = ScryptoVmVersion::V1_1.into();
        assert_eq!(v, 1);

        let v: ScryptoVmVersion = 1u64.try_into().unwrap();
        assert_eq!(v, ScryptoVmVersion::V1_1);

        let e = ScryptoVmVersion::try_from(3u64).unwrap_err();

        assert_eq!(e, ScryptoVmVersionError::FromIntError(3u64));
    }

    #[test]
    fn test_scrypto_vm_version_ordering() {
        assert!(ScryptoVmVersion::crypto_utils_v1() == ScryptoVmVersion::V1_1);
        assert!(ScryptoVmVersion::crypto_utils_v1() > ScryptoVmVersion::V1_0);
        assert!(ScryptoVmVersion::crypto_utils_v1() < ScryptoVmVersion::crypto_utils_v2());
    }
}