use ipc_channel::ipc::{self, IpcBytesReceiver, IpcBytesSender, IpcReceiver, IpcSender};
use serde::{Deserialize, Serialize};
use std::io::{Error, ErrorKind};
use std::sync::mpsc;
use std::thread;
use std::{error, io};
pub type MsgSender<T> = IpcSender<T>;
pub type MsgReceiver<T> = IpcReceiver<T>;
pub type PayloadSender = IpcBytesSender;
pub type PayloadReceiver = IpcBytesReceiver;
impl PayloadSenderHelperMethods for PayloadSender {
fn send_payload(&self, data: Payload) -> Result<(), Error> {
self.send(&data.to_data())
}
}
impl PayloadReceiverHelperMethods for PayloadReceiver {
fn recv_payload(&self) -> Result<Payload, Error> {
self.recv().map(|data| Payload::from_data(&data) )
.map_err(|e| io::Error::new(ErrorKind::Other, error::Error::description(&e)))
}
fn to_mpsc_receiver(self) -> Receiver<Payload> {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
while let Ok(payload) = self.recv_payload() {
if tx.send(payload).is_err() {
break;
}
}
});
rx
}
}
pub fn msg_channel<T: Serialize + for<'de> Deserialize<'de>>() -> Result<(MsgSender<T>, MsgReceiver<T>), Error> {
ipc::channel()
}
pub fn payload_channel() -> Result<(PayloadSender, PayloadReceiver), Error> {
ipc::bytes_channel()
}