tronz_primitives/
resource.rs1use serde::{Deserialize, Serialize};
4
5use crate::error::UnknownResourceCode;
6
7#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
12#[repr(i32)]
13pub enum ResourceCode {
14 Bandwidth = 0,
16 Energy = 1,
18 TronPower = 2,
20}
21
22impl ResourceCode {
23 pub const fn as_i32(self) -> i32 {
25 self as i32
26 }
27
28 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 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}