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}