use crate::{Error, Result};
use aerox_client::{HighLevelClient as InnerClient, StreamClient as InnerStream};
use aerox_client::Result as ClientResult;
use std::future::Future;
use std::pin::Pin;
pub struct Client {
inner: InnerClient,
}
impl Client {
pub async fn connect(addr: impl Into<String>) -> Result<Self> {
let addr_str = addr.into();
let socket_addr: std::net::SocketAddr = addr_str.parse().map_err(|e| {
Error::Custom(format!("Invalid address '{}': {}", addr_str, e))
})?;
let inner = InnerClient::connect(socket_addr)
.await
.map_err(Error::from)?;
Ok(Self { inner })
}
pub async fn on_message<M, F>(&mut self, msg_id: u16, f: F) -> Result<()>
where
M: prost::Message + Default + Send + 'static,
F: Fn(u16, M) -> Pin<Box<dyn Future<Output = ClientResult<()>> + Send>>
+ Send
+ Sync
+ 'static,
{
self.inner
.on_message(msg_id, f)
.await
.map_err(Error::from)?;
Ok(())
}
pub async fn send<M: prost::Message>(&mut self, msg_id: u16, msg: &M) -> Result<()> {
self.inner.send(msg_id, msg).await.map_err(Error::from)
}
pub async fn is_connected(&self) -> bool {
self.inner.is_connected().await
}
pub fn inner(&self) -> &InnerClient {
&self.inner
}
pub fn inner_mut(&mut self) -> &mut InnerClient {
&mut self.inner
}
pub fn into_inner(self) -> InnerClient {
self.inner
}
}
pub use aerox_client::StreamClient;