use tokio::sync::{mpsc::Sender, oneshot};
use crate::{
errors::PresenceClientError,
str,
types::{ActivitySpec, IPCCommand},
};
pub type RPCClient = PresenceClient;
#[derive(Debug, Clone)]
pub struct PresenceClient {
pub(crate) tx: Sender<IPCCommand>,
pub(crate) client_id: String,
}
impl PresenceClient {
str!(client_id, "Returns the client ID.");
pub async fn set_activity(&self, activity: ActivitySpec) -> Result<(), PresenceClientError> {
let activity = Box::new(activity);
self.tx
.send(IPCCommand::SetActivity { activity })
.await
.map_err(|_| PresenceClientError::ActivitySendError)?;
Ok(())
}
pub async fn clear_activity(&self) -> Result<(), PresenceClientError> {
self.tx
.send(IPCCommand::ClearActivity)
.await
.map_err(|_| PresenceClientError::ActivitySendError)?;
Ok(())
}
pub async fn close(&self) -> Result<(), PresenceClientError> {
let (done_tx, done_rx) = oneshot::channel::<()>();
match self.tx.send(IPCCommand::Close { done_tx }).await {
Ok(_) => done_rx.await?,
Err(_) => return Ok(()),
}
Ok(())
}
}