dwm-status 1.8.1

Displays system information for dwm status bar.
Documentation
use crate::error::Result;
use crate::error::WrapErrorExt;

use super::ERROR_NAME;

macro_rules! compare_property {
    ( $method:ident, $property:ident ) => {
        pub(crate) fn $method(&self, compare: &'static str) -> Result<bool> {
            Ok(if let Some(interface) = self.message.$property() {
                interface.as_cstr()
                    == std::ffi::CString::new(compare)
                        .wrap_error(ERROR_NAME, "failed to create CString")?
                        .as_c_str()
            } else {
                false
            })
        }
    };
}

pub(crate) struct Message {
    message: dbus::Message,
}

impl Message {
    compare_property!(is_interface, interface);

    compare_property!(is_member, member);

    pub(crate) const fn new(message: dbus::Message) -> Self {
        Self { message }
    }

    pub(crate) fn init_method_call(
        bus: &'static str,
        path: &'_ str,
        interface: &'static str,
        member: &'static str,
    ) -> Result<Self> {
        Ok(Self {
            message: dbus::Message::new_method_call(bus, path, interface, member)
                .wrap_error(ERROR_NAME, "failed to create dbus method call message")?,
        })
    }

    #[allow(clippy::missing_const_for_fn)]
    pub(super) fn raw(self) -> dbus::Message {
        self.message
    }

    pub(crate) fn return_value<'a, T>(&'a self) -> Result<T>
    where
        T: dbus::arg::Arg + dbus::arg::Get<'a>,
    {
        self.message
            .read1::<T>()
            .wrap_error(ERROR_NAME, "failed to read return value of dbus message")
    }
}