1use std::io::prelude::*;
2use std::cell::RefCell;
3use bincode::{serialize, deserialize, Infinite, Bounded};
4use bufstream::BufStream;
5
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub enum Message {
9 Dimensions((u32, u32)),
10 RgbImage(Vec<u8>),
11}
12
13#[derive(Debug)]
14pub struct Messenger<S: Read + Write> {
15 stream: RefCell<BufStream<S>>
16}
17
18impl<S: Read + Write> Messenger<S> {
19 pub fn new(stream: S) -> Messenger<S> {
20 Messenger {
21 stream: RefCell::new(BufStream::new(stream))
22 }
23 }
24
25 pub fn send(&self, message: &Message) -> Result<usize, String> {
26 let mut stream = self.stream.borrow_mut();
27 let data = match serialize(message, Infinite) {
28 Ok(d) => d,
29 Err(e) => return Err(format!("Couldn't serialize message: {}", e))
30 };
31
32 let len_data = match serialize(&data.len(), Bounded(8)) {
33 Ok(d) => d,
34 Err(e) => return Err(format!("Couldn't serialize data length: {}", e))
35 };
36
37 let mut len = match stream.write(&len_data) {
38 Ok(l) => l,
39 Err(e) => return Err(format!("Couldn't send data: {}", e))
40 };
41
42 len += match stream.write(&data) {
43 Ok(l) => l,
44 Err(e) => return Err(format!("Couldn't send data: {}", e))
45 };
46
47 match stream.flush() {
48 Ok(()) => Ok(len),
49 Err(e) => Err(format!("Couldn't flush output stream: {}", e))
50 }
51 }
52
53 pub fn recv(&self) -> Result<Message, String> {
54 let mut stream = self.stream.borrow_mut();
55 let mut len_data = [0u8; 8];
56 if let Err(e) = stream.read_exact(&mut len_data) {
57 return Err(format!("Couldn't read data length: {}", e))
58 }
59
60 let len = match deserialize(&len_data) {
61 Ok(l) => l,
62 Err(e) => return Err(format!("Couldn't deserialize data length: {}", e))
63 };
64
65 let mut data = vec![0u8; len];
66 if let Err(e) = stream.read_exact(&mut data) {
67 return Err(format!("Couldn't read data: {}", e));
68 }
69
70 match deserialize(&data[..]) {
71 Ok(m) => Ok(m),
72 Err(e) => Err(format!("Couldn't deserialize data: {}", e))
73 }
74 }
75}