1use tokio::sync::{mpsc::Sender, oneshot};
2
3use crate::{
4 errors::PresenceClientError,
5 types::{ActivitySpec, IPCCommand},
6};
7
8#[derive(Debug, Clone)]
10pub struct PresenceClient {
11 pub(crate) tx: Sender<IPCCommand>,
12 pub(crate) client_id: String,
13}
14
15impl PresenceClient {
16 #[must_use]
18 pub fn client_id(&self) -> &str {
19 &self.client_id
20 }
21
22 pub async fn set_activity(&self, activity: ActivitySpec) -> Result<(), PresenceClientError> {
27 let activity = Box::new(activity);
28
29 self.tx
30 .send(IPCCommand::SetActivity { activity })
31 .await
32 .map_err(|_| PresenceClientError::ActivitySendError)?;
33
34 Ok(())
35 }
36
37 pub async fn clear_activity(&self) -> Result<(), PresenceClientError> {
41 self.tx
42 .send(IPCCommand::ClearActivity)
43 .await
44 .map_err(|_| PresenceClientError::ActivitySendError)?;
45
46 Ok(())
47 }
48
49 pub async fn close(&self) -> Result<(), PresenceClientError> {
53 let (done_tx, done_rx) = oneshot::channel::<()>();
54
55 match self.tx.send(IPCCommand::Close { done_tx }).await {
56 Ok(_) => done_rx.await?,
57 Err(_) => return Ok(()),
58 }
59
60 Ok(())
61 }
62}