image_stream/
message.rs

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}