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
use std::{
    io::{Write, Read},
    marker::Sized,
    path::PathBuf,
};

use models::message::Message;
use error::Result;


pub trait Connection: Sized {
    type Socket: Write + Read;


    fn socket(&mut self) -> &mut Self::Socket;

    fn ipc_path() -> PathBuf;

    fn connect() -> Result<Self>;

    fn disconnect(&self) -> Result<()>;

    fn socket_path(n: u8) -> PathBuf {
        Self::ipc_path().join(format!("discord-ipc-{}", n))
    }

    fn send(&mut self, message: Message) -> Result<()> {
        match message.encode() {
            Err(why) => error!("{:?}", why),
            Ok(bytes) => {
                self.socket().write_all(bytes.as_ref())?;
            }
        };
        debug!("-> {:?}", message);
        Ok(())
    }

    fn recv(&mut self) -> Result<Message> {
        let mut buf: Vec<u8> = vec![0; 1024];
        let n = self.socket().read(buf.as_mut_slice())?;
        buf.resize(n, 0);
        let message = Message::decode(&buf)?;
        debug!("<- {:?}", message);
        Ok(message)
    }
}