1pub trait StreamTransfer {
5 fn connect(&mut self) -> Result<(), String>;
10 fn recv(&mut self) -> Result<Option<Vec<u8>>, String>;
12 fn peek(&mut self) -> Result<Option<Vec<u8>>, String>;
14 fn send(&mut self, data: Vec<u8>) -> Result<(), String>;
16}
17pub trait PacketTransfer {
19 fn connect(&mut self) -> Result<(), String>;
21 fn recv(&mut self, tag: &str) -> Result<Option<Vec<u8>>, String> {
23 let ret = self.peek(tag)?;
24 self.remove(tag)?;
25 Ok(ret)
26 }
27 fn peek(&mut self, tag: &str) -> Result<Option<Vec<u8>>, String>;
29 fn send(&mut self, tag: &str, data: Vec<u8>) -> Result<(), String>;
31 fn remove(&mut self, tag: &str) -> Result<(), String>;
33}
34pub trait DataStorage {
38 fn connect(&mut self) -> Result<(), String>;
40 fn peek(&mut self, tag: &str) -> Result<Option<Vec<u8>>, String>;
42 fn send(&mut self, tag: &str, data: Vec<u8>) -> Result<(), String>;
44 fn remove(&mut self, tag: &str) -> Result<(), String>;
46}
47pub mod extends {
52 use super::*;
53 pub struct StreamTransferOverlay<T: PacketTransfer> {
54 packet_transfer: T,
55 recv: u128,
56 send: u128,
57 }
58 impl<T: PacketTransfer> StreamTransferOverlay<T> {
59 pub fn new(packet_transfer: T) -> Self {
60 Self {
61 packet_transfer,
62 recv: 0,
63 send: 0,
64 }
65 }
66 }
67 impl<T: PacketTransfer> StreamTransfer for StreamTransferOverlay<T> {
68 fn connect(&mut self) -> Result<(), String> {
69 self.packet_transfer.connect()
70 }
71 fn recv(&mut self) -> Result<Option<Vec<u8>>, String> {
72 self.recv += 1;
73 self.packet_transfer.recv(&(self.recv - 1).to_string())
74 }
75 fn peek(&mut self) -> Result<Option<Vec<u8>>, String> {
76 self.packet_transfer.peek(&self.recv.to_string())
77 }
78 fn send(&mut self, data: Vec<u8>) -> Result<(), String> {
79 self.send += 1;
80 self.packet_transfer
81 .send(&(self.send - 1).to_string(), data)
82 }
83 }
84 impl<T: DataStorage> PacketTransfer for T {
85 fn connect(&mut self) -> Result<(), String> {
86 self.connect()
87 }
88 fn peek(&mut self, tag: &str) -> Result<Option<Vec<u8>>, String> {
89 self.peek(tag)
90 }
91 fn send(&mut self, tag: &str, data: Vec<u8>) -> Result<(), String> {
92 self.send(tag, data)
93 }
94 fn remove(&mut self, tag: &str) -> Result<(), String> {
95 self.remove(tag)
96 }
97 }
98}