rmp/
marker.rs

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