use tokio_dbus::org_freedesktop_dbus;
use crate::{Result, SignalMessage};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct NameOwnerChanged {
pub name: String,
pub old_owner: Option<String>,
pub new_owner: Option<String>,
}
impl NameOwnerChanged {
pub const MEMBER: &'static str = "NameOwnerChanged";
pub fn decode(message: &SignalMessage) -> Result<Option<Self>> {
if message.interface() != Some(org_freedesktop_dbus::INTERFACE)
|| message.member() != Self::MEMBER
|| message.sender() != Some(org_freedesktop_dbus::DESTINATION)
{
return Ok(None);
}
let mut body = message.body();
let name = body.read::<str>()?.to_owned();
let old_owner = body.read::<str>()?;
let new_owner = body.read::<str>()?;
Ok(Some(Self {
name,
old_owner: (!old_owner.is_empty()).then(|| old_owner.to_owned()),
new_owner: (!new_owner.is_empty()).then(|| new_owner.to_owned()),
}))
}
pub fn rule(name: &str) -> String {
format!(
"type='signal',sender='{bus}',interface='{bus}',member='{member}',arg0='{name}'",
bus = org_freedesktop_dbus::DESTINATION,
member = Self::MEMBER,
)
}
}