#![deny(unsafe_code)]
#![warn(missing_docs)]
use std::{error::Error, fmt};
mod cfg;
mod client;
mod credit;
mod listener;
mod msg;
mod multiplexer;
mod port_allocator;
mod receiver;
mod sender;
pub use cfg::{Cfg, PortsExhausted};
pub use client::{Client, Connect, ConnectError};
pub use listener::{Listener, ListenerError, ListenerStream, Request};
pub use multiplexer::Multiplexer;
pub use port_allocator::{PortAllocator, PortNumber};
pub use receiver::{
DataBuf, ReceiveAnyError, ReceiveChunkError, ReceiveError, Received, Receiver, ReceiverStream,
};
pub use sender::{ChunkSender, Closed, SendError, Sender, SenderSink, TrySendError};
pub const PROTOCOL_VERSION: u8 = 2;
#[derive(Debug)]
pub enum MultiplexError<SinkError, StreamError> {
SinkError(SinkError),
StreamError(StreamError),
StreamClosed,
Reset,
Timeout,
Protocol(String),
}
impl<SinkError, StreamError> fmt::Display for MultiplexError<SinkError, StreamError>
where
SinkError: fmt::Display,
StreamError: fmt::Display,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::SinkError(err) => write!(f, "send error: {}", err),
Self::StreamError(err) => write!(f, "receive error: {}", err),
Self::StreamClosed => write!(f, "end of receive stream"),
Self::Reset => write!(f, "connection reset"),
Self::Timeout => write!(f, "connection timeout"),
Self::Protocol(err) => write!(f, "protocol error: {}", err),
}
}
}
impl<SinkError, StreamError> Error for MultiplexError<SinkError, StreamError>
where
SinkError: Error,
StreamError: Error,
{
}
#[macro_export]
macro_rules! term {
($exp:expr) => {
match $exp {
Ok(v) => Ok(v),
Err(err) if err.is_terminated() => return,
Err(err) => Err(err),
}
};
}
#[macro_export]
macro_rules! ignore_term {
($exp:expr) => {
match $exp {
Ok(()) => Ok(()),
Err(err) if err.is_terminated() => Ok(()),
Err(err) => Err(err),
}
};
}