Skip to main content

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    FixMap(u8) = 0x80,
11    FixArray(u8) = 0x90,
12    FixStr(u8) = 0xa0,
13    Null = 0xc0,
14    /// Marked in MessagePack spec as never used.
15    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    /// Construct a msgpack marker from a single byte.
51    #[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            // Marked in MessagePack spec as never used.
61            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    /// Converts a marker object into a single-byte representation.
97    #[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}