sbor/
value_kind.rs

1use crate::rust::fmt::Debug;
2use crate::*;
3
4#[cfg_attr(feature = "fuzzing", derive(::arbitrary::Arbitrary))]
5#[cfg_attr(
6    feature = "serde",
7    derive(::serde::Serialize, ::serde::Deserialize),
8    serde(tag = "type") // See https://serde.rs/enum-representations.html
9)]
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum ValueKind<X: CustomValueKind> {
12    Bool,
13    I8,
14    I16,
15    I32,
16    I64,
17    I128,
18    U8,
19    U16,
20    U32,
21    U64,
22    U128,
23    String,
24    Enum,
25    Array,
26    Tuple,
27    Map,
28    Custom(X),
29}
30
31impl<X: CustomValueKind> crate::rust::fmt::Display for ValueKind<X> {
32    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
33        match self {
34            Self::Custom(x) => write!(f, "{:?}", x),
35            _ => write!(f, "{:?}", self),
36        }
37    }
38}
39
40impl<X: CustomValueKind> ValueKind<X> {
41    pub fn as_u8(&self) -> u8 {
42        match self {
43            ValueKind::Bool => VALUE_KIND_BOOL,
44            ValueKind::I8 => VALUE_KIND_I8,
45            ValueKind::I16 => VALUE_KIND_I16,
46            ValueKind::I32 => VALUE_KIND_I32,
47            ValueKind::I64 => VALUE_KIND_I64,
48            ValueKind::I128 => VALUE_KIND_I128,
49            ValueKind::U8 => VALUE_KIND_U8,
50            ValueKind::U16 => VALUE_KIND_U16,
51            ValueKind::U32 => VALUE_KIND_U32,
52            ValueKind::U64 => VALUE_KIND_U64,
53            ValueKind::U128 => VALUE_KIND_U128,
54            ValueKind::String => VALUE_KIND_STRING,
55            ValueKind::Tuple => VALUE_KIND_TUPLE,
56            ValueKind::Enum => VALUE_KIND_ENUM,
57            ValueKind::Array => VALUE_KIND_ARRAY,
58            ValueKind::Map => VALUE_KIND_MAP,
59            ValueKind::Custom(custom_value_kind) => custom_value_kind.as_u8(),
60        }
61    }
62
63    pub fn from_u8(id: u8) -> Option<Self> {
64        match id {
65            VALUE_KIND_BOOL => Some(ValueKind::Bool),
66            VALUE_KIND_I8 => Some(ValueKind::I8),
67            VALUE_KIND_I16 => Some(ValueKind::I16),
68            VALUE_KIND_I32 => Some(ValueKind::I32),
69            VALUE_KIND_I64 => Some(ValueKind::I64),
70            VALUE_KIND_I128 => Some(ValueKind::I128),
71            VALUE_KIND_U8 => Some(ValueKind::U8),
72            VALUE_KIND_U16 => Some(ValueKind::U16),
73            VALUE_KIND_U32 => Some(ValueKind::U32),
74            VALUE_KIND_U64 => Some(ValueKind::U64),
75            VALUE_KIND_U128 => Some(ValueKind::U128),
76            VALUE_KIND_STRING => Some(ValueKind::String),
77            VALUE_KIND_TUPLE => Some(ValueKind::Tuple),
78            VALUE_KIND_ENUM => Some(ValueKind::Enum),
79            VALUE_KIND_ARRAY => Some(ValueKind::Array),
80            VALUE_KIND_MAP => Some(ValueKind::Map),
81            custom_value_kind_id if custom_value_kind_id >= CUSTOM_VALUE_KIND_START => {
82                X::from_u8(custom_value_kind_id).map(ValueKind::Custom)
83            }
84            _ => None,
85        }
86    }
87}
88
89pub trait CustomValueKind: Copy + Debug + Clone + PartialEq + Eq {
90    fn as_u8(&self) -> u8;
91
92    fn from_u8(id: u8) -> Option<Self>;
93}
94
95// primitive types
96pub const VALUE_KIND_BOOL: u8 = 0x01;
97pub const VALUE_KIND_I8: u8 = 0x02;
98pub const VALUE_KIND_I16: u8 = 0x03;
99pub const VALUE_KIND_I32: u8 = 0x04;
100pub const VALUE_KIND_I64: u8 = 0x05;
101pub const VALUE_KIND_I128: u8 = 0x06;
102pub const VALUE_KIND_U8: u8 = 0x07;
103pub const VALUE_KIND_U16: u8 = 0x08;
104pub const VALUE_KIND_U32: u8 = 0x09;
105pub const VALUE_KIND_U64: u8 = 0x0a;
106pub const VALUE_KIND_U128: u8 = 0x0b;
107pub const VALUE_KIND_STRING: u8 = 0x0c;
108// composite types
109pub const VALUE_KIND_ARRAY: u8 = 0x20; // [T] or [T; N]
110pub const VALUE_KIND_TUPLE: u8 = 0x21; // Any "product type" - Units, Tuples and Structs (T1, T2, T3)
111pub const VALUE_KIND_ENUM: u8 = 0x22;
112pub const VALUE_KIND_MAP: u8 = 0x23;