packet_ipc/
server.rs

1use crate::errors::Error;
2
3use crate::packet::{AsIpcPacket, IpcPacket};
4use ipc_channel::ipc::{IpcOneShotServer, IpcSender};
5use log::*;
6
7pub type SenderMessage<'a> = Option<Vec<IpcPacket<'a>>>;
8pub type Sender<'a> = IpcSender<SenderMessage<'a>>;
9
10pub struct Server<'a> {
11    server: IpcOneShotServer<Sender<'a>>,
12    name: String,
13}
14
15impl<'a> Server<'a> {
16    pub fn name(&self) -> &String {
17        &self.name
18    }
19
20    pub fn new() -> Result<Server<'a>, Error> {
21        let (server, server_name) = IpcOneShotServer::new().map_err(Error::Io)?;
22
23        Ok(Server {
24            server: server,
25            name: server_name,
26        })
27    }
28
29    pub fn accept(self) -> Result<ConnectedIpc<'a>, Error> {
30        let (_, tx) = self.server.accept().map_err(Error::Bincode)?;
31
32        info!("Accepted connection from {:?}", tx);
33
34        Ok(ConnectedIpc { connection: tx })
35    }
36}
37
38pub struct ConnectedIpc<'a> {
39    connection: Sender<'a>,
40}
41
42impl<'a> ConnectedIpc<'a> {
43    pub fn send<T: AsIpcPacket>(&'a self, packets: &'a [T]) -> Result<(), Error> {
44        let ipc_packets: Vec<_> = packets.iter().map(IpcPacket::from).collect();
45        self.connection.send(Some(ipc_packets)).map_err(|e| {
46            error!("Failed to send {:?}", e);
47            Error::Bincode(e)
48        })
49    }
50
51    pub fn close(&mut self) -> Result<(), Error> {
52        self.connection.send(None).map_err(Error::Bincode)?;
53        Ok(())
54    }
55}