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)]
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    /// Construct a msgpack marker from a single byte.
49    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            // Marked in MessagePack spec as never used.
58            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    /// Converts a marker object into a single-byte representation.
94    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}