use time::Timespec;
use std::ops::Deref;
use std::fmt::{Display, Formatter, Error as FmtError, LowerHex};
pub trait Packet : Deref<Target=[u8]> + Display{
fn when(&self) -> Timespec;
}
#[derive(Debug)]
pub struct BorrowedPacket<'a> {
when_received: Timespec,
packet: &'a[u8],
}
impl<'a> BorrowedPacket<'a> {
pub fn new(when_received: Timespec, data: &'a[u8]) -> BorrowedPacket<'a> {
BorrowedPacket{
when_received,
packet: data,
}
}
pub fn as_owned(&self) -> OwnedPacket {
OwnedPacket::new(self.packet, self.when_received)
}
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(())
}
}
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 {
pub fn new (data: &[u8], when: Timespec) -> Self{
OwnedPacket {
packet: data.into(),
when_received: when
}
}
pub fn as_borrowed(&self) -> BorrowedPacket {
BorrowedPacket::new(self.when_received, &self.packet)
}
}