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