bromine 0.22.1

A flexible ipc protocol (previously rmp-ipc)
Documentation
use crate::error::Result;
use crate::prelude::IPCResult;
use crate::protocol::{AsyncProtocolStream, AsyncProtocolStreamSplit, AsyncStreamProtocolListener};
use async_trait::async_trait;
use std::path::PathBuf;
use tokio::io::Interest;
use tokio::net::unix::OwnedWriteHalf;
use tokio::net::unix::{OwnedReadHalf, SocketAddr};
use tokio::net::{UnixListener, UnixStream};

#[async_trait]
impl AsyncStreamProtocolListener for UnixListener {
    type AddressType = PathBuf;
    type RemoteAddressType = SocketAddr;
    type Stream = UnixStream;
    type ListenerOptions = ();

    async fn protocol_bind(address: Self::AddressType, _: Self::ListenerOptions) -> Result<Self> {
        let listener = UnixListener::bind(address)?;

        Ok(listener)
    }

    async fn protocol_accept(&self) -> Result<(Self::Stream, Self::RemoteAddressType)> {
        let connection = self.accept().await?;

        Ok(connection)
    }
}

impl AsyncProtocolStreamSplit for UnixStream {
    type OwnedSplitReadHalf = OwnedReadHalf;
    type OwnedSplitWriteHalf = OwnedWriteHalf;

    fn protocol_into_split(self) -> (Self::OwnedSplitReadHalf, Self::OwnedSplitWriteHalf) {
        self.into_split()
    }
}

#[async_trait]
impl AsyncProtocolStream for UnixStream {
    type AddressType = PathBuf;
    type StreamOptions = ();

    async fn protocol_connect(
        address: Self::AddressType,
        _: Self::StreamOptions,
    ) -> IPCResult<Self> {
        let stream = UnixStream::connect(address).await?;
        stream
            .ready(Interest::READABLE | Interest::WRITABLE)
            .await?;

        Ok(stream)
    }
}