dbus-codegen 0.3.0

Binary crate to generate Rust code from XML introspection data
Documentation
extern crate dbus;

use std::sync::atomic::*;

#[allow(dead_code)]
#[deny(trivial_casts)]
mod generated;

impl generated::OrgFreedesktopDBusProperties for () {
    type Err = ::dbus::tree::MethodErr;

    fn get(&self, interfacename: &str, propertyname: &str) -> Result<::dbus::arg::Variant<Box<::dbus::arg::RefArg>>, Self::Err> {
        assert_eq!(interfacename, "Interface.Name");
        assert_eq!(propertyname, "Property.Name");
        Ok(::dbus::arg::Variant(Box::new(5u8)))
    }

    fn get_all(&self, _interfacename: &str) -> Result<::std::collections::HashMap<String, ::dbus::arg::Variant<Box<::dbus::arg::RefArg>>>, Self::Err> { unimplemented!() }

    fn set(&self, _interfacename: &str, _propertyname: &str, value: ::dbus::arg::Variant<Box<::dbus::arg::RefArg>>) -> Result<(), Self::Err> {
        assert_eq!((&value as &dbus::arg::RefArg).as_str(), Some("Hello")); 
        Err(("A.B.C", "Error.Message").into())
    }

}

#[test]
fn test2() {
    let f = dbus::tree::Factory::new_fn::<()>();
    let i1 = generated::org_freedesktop_dbus_properties_server(&f, (), |minfo| minfo.path.get_data());
    let t = f.tree(()).add(f.object_path("/test", ()).add(i1));
    let c = dbus::Connection::get_private(dbus::BusType::Session).unwrap();
    t.set_registered(&c, true).unwrap();
    let cname = c.unique_name();
    let quit = std::sync::Arc::new(AtomicBool::new(false));
    let quit2 = quit.clone();
    let _ = std::thread::spawn(move || {
        use self::generated::OrgFreedesktopDBusProperties;
        use dbus::arg::RefArg;

        let c2 = dbus::Connection::get_private(dbus::BusType::Session).unwrap();
        let p = c2.with_path(cname, "/test", 1000);
        let v = p.get("Interface.Name", "Property.Name").unwrap();
        assert_eq!(v.as_i64(), Some(5));

        let vv = p.set("Interface.Name", "Property.Name", dbus::arg::Variant(Box::new("Hello".to_string())));
        assert_eq!(vv.unwrap_err().message(), Some("Error.Message"));

        quit2.store(true, Ordering::SeqCst);
    }); 
    for _ in t.run(&c, c.iter(100)) { if quit.load(Ordering::SeqCst) { break; } }
}