use tokio::sync::{mpsc::Sender, oneshot};
use crate::{
errors::PresenceClientError,
types::{Activity, IPCCommand},
};
#[derive(Debug, Clone)]
pub struct PresenceClient {
pub(crate) tx: Sender<IPCCommand>,
pub(crate) client_id: String,
}
impl PresenceClient {
#[must_use]
pub fn client_id(&self) -> &str {
&self.client_id
}
pub async fn set_activity(&self, activity: Activity) -> 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(())
}
}