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