Skip to main content

tronz_primitives/
resource.rs

1//! TRON stakeable resource types.
2
3use serde::{Deserialize, Serialize};
4
5use crate::error::UnknownResourceCode;
6
7/// The kind of network resource obtained by staking TRX.
8///
9/// Discriminants match the protobuf `ResourceCode` enum so the value can be
10/// used directly when building contract parameters.
11#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
12#[repr(i32)]
13pub enum ResourceCode {
14    /// Network bandwidth (free + staked).
15    Bandwidth = 0,
16    /// Energy, consumed when executing smart contracts.
17    Energy = 1,
18    /// TRON Power, the voting weight obtained from staking.
19    TronPower = 2,
20}
21
22impl ResourceCode {
23    /// The protobuf discriminant for this resource.
24    pub const fn as_i32(self) -> i32 {
25        self as i32
26    }
27
28    /// Convert from a protobuf discriminant, returning `None` if unknown.
29    pub const fn from_i32(value: i32) -> Option<Self> {
30        match value {
31            0 => Some(ResourceCode::Bandwidth),
32            1 => Some(ResourceCode::Energy),
33            2 => Some(ResourceCode::TronPower),
34            _ => None,
35        }
36    }
37}
38
39impl From<ResourceCode> for i32 {
40    fn from(resource: ResourceCode) -> Self {
41        resource.as_i32()
42    }
43}
44
45impl TryFrom<i32> for ResourceCode {
46    type Error = UnknownResourceCode;
47
48    fn try_from(value: i32) -> Result<Self, Self::Error> {
49        Self::from_i32(value).ok_or(UnknownResourceCode(value))
50    }
51}
52
53impl Default for ResourceCode {
54    /// Energy is the most commonly staked-for resource and matches the default
55    /// used by the staking builders.
56    fn default() -> Self {
57        ResourceCode::Energy
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64
65    #[test]
66    fn discriminants() {
67        assert_eq!(ResourceCode::Bandwidth.as_i32(), 0);
68        assert_eq!(ResourceCode::Energy.as_i32(), 1);
69        assert_eq!(ResourceCode::TronPower.as_i32(), 2);
70        assert_eq!(ResourceCode::from_i32(1), Some(ResourceCode::Energy));
71        assert_eq!(ResourceCode::from_i32(9), None);
72        assert_eq!(ResourceCode::default(), ResourceCode::Energy);
73        assert_eq!(i32::from(ResourceCode::TronPower), 2);
74        assert_eq!(ResourceCode::try_from(2).unwrap(), ResourceCode::TronPower);
75        assert!(ResourceCode::try_from(9).is_err());
76    }
77}