use crate::{Buf, BufError, BufMut, BufResult, Codec, Cursor};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(u8)]
pub enum Version {
Ip = 4,
Ipv6 = 6,
}
impl Codec for Version {
fn encode<W: BufMut>(&self, writer: &mut Cursor<W>, _: ()) -> BufResult<()> {
let original_byte = writer.peek_u8().unwrap_or(0);
let packed_byte = ((*self as u8) << 4) | (original_byte & 0x0F);
writer.poke_u8(packed_byte)
}
fn decode<R: Buf>(reader: &mut Cursor<R>, _: ()) -> BufResult<Self> {
let byte = reader.peek_u8()? >> 4;
match byte {
4 => Ok(Self::Ip),
6 => Ok(Self::Ipv6),
_ => Err(BufError::UnexpectedValue),
}
}
}