#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum ElementType {
Null = 0,
True = 1,
False = 2,
Int = 3,
Int5 = 4,
Float = 5,
Float5 = 6,
Text = 7,
TextJ = 8,
Text5 = 9,
TextRaw = 0xA,
Array = 0xB,
Object = 0xC,
Reserved13 = 0xD,
Reserved14 = 0xE,
Reserved15 = 0xF,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Header {
pub element_type: ElementType,
pub payload_size: u64,
}
impl Header {
pub fn serialize(self) -> [u8; 9] {
let mut s = [0u8; 9];
s[0] = u8::from(self.element_type) | 0xF0;
let payload_size = self.payload_size.to_be_bytes();
s[1..].copy_from_slice(&payload_size);
s
}
}
impl std::convert::From<u8> for ElementType {
fn from(value: u8) -> Self {
match value & 0x0F {
0 => ElementType::Null,
1 => ElementType::True,
2 => ElementType::False,
3 => ElementType::Int,
4 => ElementType::Int5,
5 => ElementType::Float,
6 => ElementType::Float5,
7 => ElementType::Text,
8 => ElementType::TextJ,
9 => ElementType::Text5,
0xA => ElementType::TextRaw,
0xB => ElementType::Array,
0xC => ElementType::Object,
0xD => ElementType::Reserved13,
0xE => ElementType::Reserved14,
0xF => ElementType::Reserved15,
_ => unreachable!("A four-bit number cannot be larger than 15"),
}
}
}
impl std::convert::From<ElementType> for u8 {
fn from(value: ElementType) -> Self {
value as u8
}
}