cfun 0.2.11

Tidy up common functions
Documentation
#[cfg(feature = "net")]
use futures::{
    stream::{SplitSink, SplitStream},
    StreamExt,
};
#[cfg(feature = "net")]
use tokio::net::TcpStream;
#[cfg(feature = "net")]
use tokio_util::codec::{AnyDelimiterCodec, Framed};

#[cfg(feature = "net")]
pub type FrameSender<T> = SplitSink<Framed<TcpStream, AnyDelimiterCodec>, T>;
#[cfg(feature = "net")]
pub type FrameReceiver = SplitStream<Framed<TcpStream, AnyDelimiterCodec>>;

/// split a Tcpstream to sender/receiver frame stream.
#[cfg(feature = "net")]
pub fn frame_stream_split<T>(stream: TcpStream, split: Vec<u8>) -> (FrameSender<T>, FrameReceiver)
where
    T: AsRef<str>,
{
    let codec = AnyDelimiterCodec::new(split.clone(), split);
    let frame = Framed::new(stream, codec);
    frame.split::<T>()
}

/// combined sender/receiver frame stream to TcoStream.
#[cfg(feature = "net")]
pub fn frame_stream_combined<T>(sender: FrameSender<T>, receiver: FrameReceiver) -> TcpStream
where
    T: AsRef<str>,
{
    sender.reunite(receiver).unwrap().into_parts().io
}

/// Copy data mutually between two Tcpstreams.
#[cfg(feature = "net")]
pub async fn proxy_tcpstream(
    mut stream1: TcpStream,
    mut stream2: TcpStream,
) -> Result<(u64, u64), std::io::Error> {
    use tokio::io::copy_bidirectional;

    let (s1, s2) = copy_bidirectional(&mut stream1, &mut stream2).await?;
    Ok((s1, s2))
}

#[tokio::test]
#[cfg(feature = "net")]
async fn test_tokio() {
    let stream = tokio::net::TcpStream::connect("127.0.0.1:8000")
        .await
        .unwrap();
    let (sender, receiver) = frame_stream_split::<String>(stream, b"\0".to_vec());
    let _stream = frame_stream_combined(sender, receiver);
}