use dbus_async::DBus;
use dbus_message_parser::{
match_rule::MatchRule,
message::{Message, MessageType},
value::Value,
};
use futures::{channel::mpsc::channel, stream::StreamExt};
use std::convert::TryInto;
#[tokio::main]
async fn main() {
let (dbus, _connection_handle) = DBus::session(true, true)
.await
.expect("failed to get the DBus object");
let mut msg_add_match = Message::method_call(
"org.freedesktop.DBus".try_into().unwrap(),
"/org/freedesktop/DBus".try_into().unwrap(),
"org.freedesktop.DBus".try_into().unwrap(),
"AddMatch".try_into().unwrap(),
);
let match_rules = vec![
MatchRule::Type(MessageType::Signal),
];
println!("{}", MatchRule::encode(&match_rules));
msg_add_match.add_value(Value::String(MatchRule::encode(&match_rules)));
dbus.call(msg_add_match)
.await
.expect("Could not add match rule");
let match_rules = vec![
MatchRule::Type(MessageType::Signal),
MatchRule::Sender("org.freedesktop.DBus".try_into().unwrap()),
];
let (sender, mut receiver) = channel::<Message>(1024);
if let Err(e) = dbus.add_match_rules(match_rules, sender) {
panic!("Cannot add path: {:?}", e);
}
while let Some(msg) = receiver.next().await {
println!("{:?}", msg);
}
}