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) } }