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") )]
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
95pub 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;
108pub const VALUE_KIND_ARRAY: u8 = 0x20; pub const VALUE_KIND_TUPLE: u8 = 0x21; pub const VALUE_KIND_ENUM: u8 = 0x22;
112pub const VALUE_KIND_MAP: u8 = 0x23;