Revision control

Copy as Markdown

Other Tools

const FIXSTR_SIZE : u8 = 0x1f;
const FIXARRAY_SIZE : u8 = 0x0f;
const FIXMAP_SIZE : u8 = 0x0f;
/// Format markers.
#[derive(Clone, Copy, Debug, PartialEq)]
#[repr(u8)]
pub enum Marker {
FixPos(u8) = 0x00,
FixNeg(i8) = 0xe0,
FixMap(u8) = 0x80,
FixArray(u8) = 0x90,
FixStr(u8) = 0xa0,
Null = 0xc0,
// Marked in MessagePack spec as never used.
Reserved,
False,
True,
Bin8,
Bin16,
Bin32,
Ext8,
Ext16,
Ext32,
F32,
F64,
U8,
U16,
U32,
U64,
I8,
I16,
I32,
I64,
FixExt1,
FixExt2,
FixExt4,
FixExt8,
FixExt16,
Str8,
Str16,
Str32,
Array16,
Array32,
Map16,
Map32,
}
impl Marker {
/// Construct a msgpack marker from a single byte.
#[must_use]
#[inline]
pub fn from_u8(n: u8) -> Marker {
match n {
0x00 ..= 0x7f => Marker::FixPos(n),
0xe0 ..= 0xff => Marker::FixNeg(n as i8),
0x80 ..= 0x8f => Marker::FixMap(n & FIXMAP_SIZE),
0x90 ..= 0x9f => Marker::FixArray(n & FIXARRAY_SIZE),
0xa0 ..= 0xbf => Marker::FixStr(n & FIXSTR_SIZE),
0xc0 => Marker::Null,
// Marked in MessagePack spec as never used.
0xc1 => Marker::Reserved,
0xc2 => Marker::False,
0xc3 => Marker::True,
0xc4 => Marker::Bin8,
0xc5 => Marker::Bin16,
0xc6 => Marker::Bin32,
0xc7 => Marker::Ext8,
0xc8 => Marker::Ext16,
0xc9 => Marker::Ext32,
0xca => Marker::F32,
0xcb => Marker::F64,
0xcc => Marker::U8,
0xcd => Marker::U16,
0xce => Marker::U32,
0xcf => Marker::U64,
0xd0 => Marker::I8,
0xd1 => Marker::I16,
0xd2 => Marker::I32,
0xd3 => Marker::I64,
0xd4 => Marker::FixExt1,
0xd5 => Marker::FixExt2,
0xd6 => Marker::FixExt4,
0xd7 => Marker::FixExt8,
0xd8 => Marker::FixExt16,
0xd9 => Marker::Str8,
0xda => Marker::Str16,
0xdb => Marker::Str32,
0xdc => Marker::Array16,
0xdd => Marker::Array32,
0xde => Marker::Map16,
0xdf => Marker::Map32,
}
}
/// Converts a marker object into a single-byte representation.
#[must_use]
#[inline]
pub fn to_u8(&self) -> u8 {
match *self {
Marker::FixPos(val) => val,
Marker::FixNeg(val) => val as u8,
Marker::Null => 0xc0,
Marker::True => 0xc3,
Marker::False => 0xc2,
Marker::U8 => 0xcc,
Marker::U16 => 0xcd,
Marker::U32 => 0xce,
Marker::U64 => 0xcf,
Marker::I8 => 0xd0,
Marker::I16 => 0xd1,
Marker::I32 => 0xd2,
Marker::I64 => 0xd3,
Marker::F32 => 0xca,
Marker::F64 => 0xcb,
Marker::FixStr(len) => 0xa0 | (len & FIXSTR_SIZE),
Marker::Str8 => 0xd9,
Marker::Str16 => 0xda,
Marker::Str32 => 0xdb,
Marker::Bin8 => 0xc4,
Marker::Bin16 => 0xc5,
Marker::Bin32 => 0xc6,
Marker::FixArray(len) => 0x90 | (len & FIXARRAY_SIZE),
Marker::Array16 => 0xdc,
Marker::Array32 => 0xdd,
Marker::FixMap(len) => 0x80 | (len & FIXMAP_SIZE),
Marker::Map16 => 0xde,
Marker::Map32 => 0xdf,
Marker::FixExt1 => 0xd4,
Marker::FixExt2 => 0xd5,
Marker::FixExt4 => 0xd6,
Marker::FixExt8 => 0xd7,
Marker::FixExt16 => 0xd8,
Marker::Ext8 => 0xc7,
Marker::Ext16 => 0xc8,
Marker::Ext32 => 0xc9,
Marker::Reserved => 0xc1,
}
}
}
impl From<u8> for Marker {
#[inline(always)]
fn from(val: u8) -> Marker {
Marker::from_u8(val)
}
}
impl From<Marker> for u8 {
#[inline(always)]
fn from(val: Marker) -> Self {
val.to_u8()
}
}