use crate::{
error::*,
notification::Notification,
xdg::{self, ActionResponseHandler, CloseReason, NotificationResponse},
};
use super::{send_notification_via_connection, wait_for_action_signal};
#[derive(Debug)]
pub struct ZbusNotificationHandle {
pub(crate) id: u32,
pub(crate) connection: zbus::Connection,
pub(crate) notification: Notification,
}
impl ZbusNotificationHandle {
pub(crate) fn new(
id: u32,
connection: zbus::Connection,
notification: Notification,
) -> ZbusNotificationHandle {
ZbusNotificationHandle {
id,
connection,
notification,
}
}
pub async fn wait_for_action(&self, invocation_closure: impl ActionResponseHandler) {
wait_for_action_signal(&self.connection, self.id, invocation_closure).await;
}
pub async fn close_fallible(&self) -> Result<()> {
self.connection
.call_method(
Some(self.notification.bus.clone().into_name()),
xdg::NOTIFICATION_OBJECTPATH,
Some(xdg::NOTIFICATION_INTERFACE),
"CloseNotification",
&(self.id),
)
.await?;
Ok(())
}
pub async fn close(&self) {
let _ = self.close_fallible().await;
}
pub fn on_close<F>(self, closure: F)
where
F: FnOnce(CloseReason),
{
zbus::block_on(self.wait_for_action(|action: &NotificationResponse| {
if let NotificationResponse::Closed(reason) = action {
closure(*reason);
}
}));
}
pub fn update_fallible(&mut self) -> Result<()> {
self.id = zbus::block_on(send_notification_via_connection(
&self.notification,
self.id,
&self.connection,
))?;
Ok(())
}
pub fn update(&mut self) -> Result<()> {
self.update_fallible()
}
}