extern crate dbus;
use std::sync::Arc;
use dbus::blocking::Connection;
use dbus::tree::Factory;
use std::error::Error;
use std::time::Duration;
fn main() -> Result<(), Box<dyn Error>> {
let mut c = Connection::new_session()?;
c.request_name("com.example.dbustest", false, true, false)?;
let f = Factory::new_fn::<()>();
let signal = Arc::new(f.signal("HelloHappened", ()).sarg::<&str,_>("sender"));
let signal2 = signal.clone();
let tree = f.tree(()).add(f.object_path("/hello", ()).introspectable().add(
f.interface("com.example.dbustest", ()).add_m(
f.method("Hello", (), move |m| {
let name: &str = m.msg.read1()?;
let s = format!("Hello {}!", name);
let mret = m.msg.method_return().append1(s);
let sig = signal.msg(m.path.get_name(), m.iface.get_name())
.append1(&*name);
Ok(vec!(mret, sig))
}).outarg::<&str,_>("reply")
.inarg::<&str,_>("name")
).add_s(signal2)
)).add(f.object_path("/", ()).introspectable());
tree.start_receive(&c);
loop { c.process(Duration::from_millis(1000))?; }
}