1const FIXSTR_SIZE : u8 = 0x1f;
2const FIXARRAY_SIZE : u8 = 0x0f;
3const FIXMAP_SIZE : u8 = 0x0f;
4
5#[derive(Clone, Copy, Debug, PartialEq)]
7#[repr(u8)]
8pub enum Marker {
9 FixPos(u8) = 0x00,
10 FixNeg(i8) = 0xe0,
11 FixMap(u8) = 0x80,
12 FixArray(u8) = 0x90,
13 FixStr(u8) = 0xa0,
14 Null = 0xc0,
15 Reserved,
17 False,
18 True,
19 Bin8,
20 Bin16,
21 Bin32,
22 Ext8,
23 Ext16,
24 Ext32,
25 F32,
26 F64,
27 U8,
28 U16,
29 U32,
30 U64,
31 I8,
32 I16,
33 I32,
34 I64,
35 FixExt1,
36 FixExt2,
37 FixExt4,
38 FixExt8,
39 FixExt16,
40 Str8,
41 Str16,
42 Str32,
43 Array16,
44 Array32,
45 Map16,
46 Map32,
47}
48
49impl Marker {
50 #[must_use]
52 #[inline]
53 pub fn from_u8(n: u8) -> Marker {
54 match n {
55 0x00 ..= 0x7f => Marker::FixPos(n),
56 0xe0 ..= 0xff => Marker::FixNeg(n as i8),
57 0x80 ..= 0x8f => Marker::FixMap(n & FIXMAP_SIZE),
58 0x90 ..= 0x9f => Marker::FixArray(n & FIXARRAY_SIZE),
59 0xa0 ..= 0xbf => Marker::FixStr(n & FIXSTR_SIZE),
60 0xc0 => Marker::Null,
61 0xc1 => Marker::Reserved,
63 0xc2 => Marker::False,
64 0xc3 => Marker::True,
65 0xc4 => Marker::Bin8,
66 0xc5 => Marker::Bin16,
67 0xc6 => Marker::Bin32,
68 0xc7 => Marker::Ext8,
69 0xc8 => Marker::Ext16,
70 0xc9 => Marker::Ext32,
71 0xca => Marker::F32,
72 0xcb => Marker::F64,
73 0xcc => Marker::U8,
74 0xcd => Marker::U16,
75 0xce => Marker::U32,
76 0xcf => Marker::U64,
77 0xd0 => Marker::I8,
78 0xd1 => Marker::I16,
79 0xd2 => Marker::I32,
80 0xd3 => Marker::I64,
81 0xd4 => Marker::FixExt1,
82 0xd5 => Marker::FixExt2,
83 0xd6 => Marker::FixExt4,
84 0xd7 => Marker::FixExt8,
85 0xd8 => Marker::FixExt16,
86 0xd9 => Marker::Str8,
87 0xda => Marker::Str16,
88 0xdb => Marker::Str32,
89 0xdc => Marker::Array16,
90 0xdd => Marker::Array32,
91 0xde => Marker::Map16,
92 0xdf => Marker::Map32,
93 }
94 }
95
96 #[must_use]
98 #[inline]
99 pub fn to_u8(&self) -> u8 {
100 match *self {
101 Marker::FixPos(val) => val,
102 Marker::FixNeg(val) => val as u8,
103
104 Marker::Null => 0xc0,
105
106 Marker::True => 0xc3,
107 Marker::False => 0xc2,
108
109 Marker::U8 => 0xcc,
110 Marker::U16 => 0xcd,
111 Marker::U32 => 0xce,
112 Marker::U64 => 0xcf,
113
114 Marker::I8 => 0xd0,
115 Marker::I16 => 0xd1,
116 Marker::I32 => 0xd2,
117 Marker::I64 => 0xd3,
118
119 Marker::F32 => 0xca,
120 Marker::F64 => 0xcb,
121
122 Marker::FixStr(len) => 0xa0 | (len & FIXSTR_SIZE),
123 Marker::Str8 => 0xd9,
124 Marker::Str16 => 0xda,
125 Marker::Str32 => 0xdb,
126
127 Marker::Bin8 => 0xc4,
128 Marker::Bin16 => 0xc5,
129 Marker::Bin32 => 0xc6,
130
131 Marker::FixArray(len) => 0x90 | (len & FIXARRAY_SIZE),
132 Marker::Array16 => 0xdc,
133 Marker::Array32 => 0xdd,
134
135 Marker::FixMap(len) => 0x80 | (len & FIXMAP_SIZE),
136 Marker::Map16 => 0xde,
137 Marker::Map32 => 0xdf,
138
139 Marker::FixExt1 => 0xd4,
140 Marker::FixExt2 => 0xd5,
141 Marker::FixExt4 => 0xd6,
142 Marker::FixExt8 => 0xd7,
143 Marker::FixExt16 => 0xd8,
144 Marker::Ext8 => 0xc7,
145 Marker::Ext16 => 0xc8,
146 Marker::Ext32 => 0xc9,
147
148 Marker::Reserved => 0xc1,
149 }
150 }
151}
152
153impl From<u8> for Marker {
154 #[inline(always)]
155 fn from(val: u8) -> Marker {
156 Marker::from_u8(val)
157 }
158}
159
160impl From<Marker> for u8 {
161 #[inline(always)]
162 fn from(val: Marker) -> Self {
163 val.to_u8()
164 }
165}