rawsock 0.3.0

Library for receiving and sending raw packets. While most crate wrap just one library, rawsock allows you to use pcap, wpcap, npcap and pf_ring (pfring) using a consistent API for all of them.
Documentation
use time::Timespec;
use std::ops::Deref;
use std::fmt::{Display, Formatter, Error as FmtError, LowerHex};

///Trait for obtained packets - common part between borrowed and owned versions.
pub trait Packet : Deref<Target=[u8]> + Display{
    ///Returns the time when this packet was received.
    fn when(&self) -> Timespec;
}

///Structure representing obtained raw packet - borrowed version.
#[derive(Debug)]
pub struct BorrowedPacket<'a> {
    when_received: Timespec,
    packet: &'a[u8],
    //_marker: PhantomData<&'a mut u32>
}

impl<'a> BorrowedPacket<'a> {
    ///Creates a new Packet instance.
    pub fn new(when_received: Timespec, data: &'a[u8]) -> BorrowedPacket<'a> {
        BorrowedPacket{
            when_received,
            packet: data,
            //_marker: PhantomData
        }
    }
    ///Converts Borrowed packet into owned version.
    pub fn as_owned(&self) -> OwnedPacket {
        OwnedPacket::new(self.packet, self.when_received)
    }
    ///Converts Borrowed packet into owned version.
    pub fn into_owned(self) -> OwnedPacket {
        OwnedPacket::new(self.packet, self.when_received)
    }
}

impl<'a> Deref for BorrowedPacket<'a> {
    type Target = [u8];

    fn deref(&self) -> &Self::Target {
        self.packet
    }
}

impl<'a> Packet for BorrowedPacket<'a> {

    fn when(&self) -> Timespec {
        self.when_received
    }
}

impl<'a> Display for BorrowedPacket<'a> {
    fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> {
        for b in self.packet {
            LowerHex::fmt(b, f)?;
        }
        Ok(())
    }
}

///Structure representing obtained raw packet - owned version.
pub struct OwnedPacket {
    when_received: Timespec,
    packet: Vec<u8>
}

impl Packet for OwnedPacket{

    fn when(&self) -> Timespec {
        self.when_received
    }
}

impl Deref for OwnedPacket {
    type Target = [u8];

    fn deref(&self) -> &Self::Target {
        &self.packet
    }
}

impl Display for OwnedPacket {
    fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> {
        for b in &self.packet {
            LowerHex::fmt(b, f)?;
        }
        Ok(())
    }
}

impl OwnedPacket {
    ///Creates owned packet from provided data.
    pub fn new (data: &[u8], when: Timespec) -> Self{
        OwnedPacket {
            packet: data.into(),
            when_received: when
        }
    }

    ///Returns its borrowed version.
    pub fn as_borrowed(&self) -> BorrowedPacket {
        BorrowedPacket::new(self.when_received, &self.packet)
    }
}