Я хочу получить некоторые свойства с использованием ящика dbus, но пример не работает правильно для моего случая.
Код скелета:
fn main() {
let mut conn = Connection::new_session().expect("D-Bus connection failed");
let p = conn.with_proxy("X.Y.Z", "/X/Y/Z", Duration::from_millis(5000));
let elapsed = p.get("X.Y.Z", "VAR");
//...
}
Использование dbus::blocking::stdintf::org_freedesktop_dbus::Properties
, как описано в примере, не работает для меня:
error[E0283]: type annotations required: cannot resolve `for<'b> _: dbus::arg::Get<'b>`
--> src/main.rs:169:21
|
169 | let elapsed = p.get("X.Y.Z", "VAR");
| ^^^
Чтобы это работало, мне пришлось использовать dbus-codegen-rust
, скопировать и вставить выходной код для интерфейса org.freedesktop.DBus.Properties
:
pub trait OrgFreedesktopDBusProperties {
fn get(&self, interface_name: &str, property_name: &str) -> Result<arg::Variant<Box<dyn arg::RefArg + 'static>>, dbus::Error>;
fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap<String, arg::Variant<Box<dyn arg::RefArg + 'static>>>, dbus::Error>;
fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant<Box<dyn arg::RefArg>>) -> Result<(), dbus::Error>;
}
impl<'a, C: ::std::ops::Deref<Target=blocking::Connection>> OrgFreedesktopDBusProperties for blocking::Proxy<'a, C> {
fn get(&self, interface_name: &str, property_name: &str) -> Result<arg::Variant<Box<dyn arg::RefArg + 'static>>, dbus::Error> {
self.method_call("org.freedesktop.DBus.Properties", "Get", (interface_name, property_name, ))
.and_then(|r: (arg::Variant<Box<dyn arg::RefArg + 'static>>, )| Ok(r.0, ))
}
fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap<String, arg::Variant<Box<dyn arg::RefArg + 'static>>>, dbus::Error> {
self.method_call("org.freedesktop.DBus.Properties", "GetAll", (interface_name, ))
.and_then(|r: (::std::collections::HashMap<String, arg::Variant<Box<dyn arg::RefArg + 'static>>>, )| Ok(r.0, ))
}
fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant<Box<dyn arg::RefArg>>) -> Result<(), dbus::Error> {
self.method_call("org.freedesktop.DBus.Properties", "Set", (interface_name, property_name, value, ))
}
}
Что я здесь не так делаю?