netstack 0.3.0

A batteries included networking crate for games.
Documentation
use std::io::{self, Read};
use super::{RawPacket, HEADER_SIZE, Payload, PacketType};

pub struct IncomingPacket {
    buffer: RawPacket,
    bytes_read: usize,
}

impl IncomingPacket {
    pub fn from_raw_packet(buffer: RawPacket) -> Self {
        Self {
            buffer,
            bytes_read: HEADER_SIZE,
        }
    }

    pub fn get_sequence_number(&self) -> u64 {
        self.buffer.get_header().sequence_number
    }

    pub fn get_ack_sequence_number(&self) -> u64 {
        self.buffer.get_header().ack_sequence_number
    }

    pub fn get_ack_bits(&self) -> [u8; 4] {
        self.buffer.get_header().ack_bits.clone()
    }

    pub fn get_packet_type(&self) -> Option<PacketType> {
        PacketType::from_u8(self.buffer.get_header().packet_type)
    }

    pub fn get_body_length(&self) -> u16 {
        self.buffer.get_header().body_length
    }

    pub fn into_payload(self) -> Payload {
        Payload::from_raw_packet(self.buffer)
    }
}

impl Read for IncomingPacket {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
        let len = buf.len();

        if self.bytes_read + len > self.buffer.get_buffer().len() {
            panic!("TODO: cannot read beyond buffer");
        }

        buf.copy_from_slice(&self.buffer.get_buffer()[self.bytes_read..self.bytes_read + len]);
        self.bytes_read += len;

        Ok(len)
    }
}