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