use crate::Peer;
use serve::Serve;
use std::sync::Arc;
use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, BufReader};
pub use conn::ClientConn;
pub use role::Agent;
mod conn;
mod role;
mod serve;
pub fn serve<S, A>(stream: S, agent: Arc<A>) -> ClientConn
where
S: AsyncRead + AsyncWrite + Send + 'static,
A: Agent,
{
ClientConn(Peer::duplex(stream, Arc::new(Serve(agent))))
}
pub fn serve_on<R, W, A>(reader: R, writer: W, agent: Arc<A>) -> ClientConn
where
R: AsyncBufRead + Unpin + Send + 'static,
W: AsyncWrite + Unpin + Send + 'static,
A: Agent,
{
ClientConn(Peer::new(reader, writer, Arc::new(Serve(agent))))
}
pub fn serve_on_stdio<A: Agent>(agent: Arc<A>) -> ClientConn {
serve_on(
BufReader::new(tokio::io::stdin()),
tokio::io::stdout(),
agent,
)
}