embedded_msgpack/
marker.rs

1pub const FIXSTR_SIZE: u8 = 0x1f;
2pub const FIXARRAY_SIZE: u8 = 0x0f;
3pub const FIXMAP_SIZE: u8 = 0x0f;
4
5/// Format markers.
6#[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    /// Construct a msgpack marker from a single byte.
50    #[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            // Marked in MessagePack spec as never used.
60            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    /// Converts a marker object into a single-byte representation.
95    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}