1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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)
}
}