internet 0.0.3

Network library for rust
Documentation
//! IP version-independent properties.

use crate::{Buf, BufError, BufMut, BufResult, Codec, Cursor};

/// An Internet Protocol version number.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(u8)]
pub enum Version {
    /// IPv4
    Ip = 4,
    /// IPv6
    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),
        }
    }
}