use std::num::NonZero;
use tokio::sync::mpsc::{self, Sender, channel};
pub use self::connection::Connection;
pub use self::futures::Futures;
use self::message::Message;
pub use self::receiver::Receive;
use self::receiver::Receiver;
pub use self::translatable_event::TranslatableEvent;
pub use self::transmitter::Transmit;
use self::transmitter::Transmitter;
use crate::api::negotiate_version::NegotiateVersion;
use crate::{Callback, Error};
mod connection;
mod futures;
mod message;
mod negotiate_version;
mod receiver;
mod translatable_event;
mod transmitter;
#[derive(Debug)]
pub struct Client {
pub(crate) handle: Sender<Message>,
pub(crate) callbacks: mpsc::Receiver<Callback>,
}
impl Client {
#[must_use]
pub fn run<T, R>(
transmit: T,
receive: R,
channel_size: usize,
) -> (
Self,
Futures<
impl Future<Output = ()> + Send + 'static,
impl Future<Output = ()> + Send + 'static,
>,
)
where
T: Transmit + Send + 'static,
R: Receive + Send + 'static,
{
let (handle, msg_rx) = channel(channel_size);
let transmitter = Transmitter::new(transmit, msg_rx).run();
let (cb_tx, callbacks) = channel(channel_size);
let receiver = Receiver::new(receive, cb_tx, handle.clone()).run();
(
Self { handle, callbacks },
Futures {
transmitter,
receiver,
},
)
}
pub async fn connect(
self,
desired_version: NonZero<u8>,
) -> Result<(Connection, mpsc::Receiver<Callback>), Error> {
self.handle.negotiate_version(desired_version).await?;
Ok((
Connection {
desired_version,
handle: self.handle,
},
self.callbacks,
))
}
}