1use tokio::sync::{mpsc::Sender, oneshot};
2
3use crate::{
4 errors::PresenceClientError,
5 str,
6 types::{ActivitySpec, IPCCommand},
7};
8
9#[derive(Debug, Clone)]
11pub struct PresenceClient {
12 pub(crate) tx: Sender<IPCCommand>,
13 pub(crate) client_id: String,
14}
15
16impl PresenceClient {
17 str!(client_id, "Returns the client ID.");
18
19 pub async fn set_activity(&self, activity: ActivitySpec) -> Result<(), PresenceClientError> {
24 let activity = Box::new(activity);
25
26 self.tx
27 .send(IPCCommand::SetActivity { activity })
28 .await
29 .map_err(|_| PresenceClientError::ActivitySendError)?;
30
31 Ok(())
32 }
33
34 pub async fn clear_activity(&self) -> Result<(), PresenceClientError> {
38 self.tx
39 .send(IPCCommand::ClearActivity)
40 .await
41 .map_err(|_| PresenceClientError::ActivitySendError)?;
42
43 Ok(())
44 }
45
46 pub async fn close(&self) -> Result<(), PresenceClientError> {
50 let (done_tx, done_rx) = oneshot::channel::<()>();
51
52 match self.tx.send(IPCCommand::Close { done_tx }).await {
53 Ok(_) => done_rx.await?,
54 Err(_) => return Ok(()),
55 }
56
57 Ok(())
58 }
59}