use async_trait::async_trait;
use dbus_async::{Binder, DBus, DBusResult, Handler};
use dbus_message_parser::{message::Message, value::Value};
use futures::lock::Mutex;
use std::{convert::TryInto, sync::Arc};
struct UserDefinedObject {}
impl UserDefinedObject {
fn new() -> UserDefinedObject {
UserDefinedObject {}
}
}
#[async_trait]
impl Handler for UserDefinedObject {
async fn handle(&mut self, dbus: &DBus, msg: Message) -> DBusResult<()> {
println!("Got message {:?}", msg);
if let Ok(mut msg) = msg.method_return() {
msg.add_value(Value::String("Hello world".to_string()));
println!("Response: Hello world");
dbus.send(msg)?;
}
Ok(())
}
}
#[tokio::main]
async fn main() {
let (dbus, _connection_handle) = DBus::session(true, true)
.await
.expect("failed to get the DBus object");
let dbus_object = UserDefinedObject::new();
let mutex_dbus_object = Arc::new(Mutex::new(dbus_object));
let object_path = "/object/path".try_into().unwrap();
mutex_dbus_object
.bind(dbus, object_path)
.await
.expect("No more message to receive");
}