#dbus #macro-derive #derive #async #properties #message-parser

dbus-async-derive

dbus-async的Handler trait派生宏

5个稳定版本

2.0.2 2021年1月3日
2.0.1 2021年1月2日
2.0.0 2020年12月5日
1.1.0 2020年6月30日
1.0.0 2020年6月14日

#1337异步

BSD-3-Clause

64KB
1.5K SLoC

dbus-async-derive

dbus-async-derive 是一个proc derive宏,用于实现 dbus_async::Handler。这个crate应该用于创建DBus服务。 最新版本 许可证

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
dbus-async-derive = "2.0"
dbus-async = "2.0"
dbus-message-parser = "3.1"
async-trait = "0.1"

示例

以下示例展示了如何使用接口 org.example.interface 创建DBus服务。此接口有一个方法 ExampleMethod 和一个属性 ExampleProperty。该对象在 /org/example/object/path 可用。

use dbus_async::{Binder, DBus};
use dbus_async_derive::Handler;
use dbus_message_parser::{Error, MessageHeader};
use std::convert::TryInto;

#[derive(Handler)]
#[interface(
    "org.example.interface",
    method("ExampleMethod", method),
    property("ExampleProperty", "s", get_property = "get", set_property = "set")
)]
struct DBusObject {
    property: String,
}

impl DBusObject {
    async fn method(
        &mut self,
        dbus: &DBus,
        _msg_header: &MessageHeader,
    ) -> Result<(), (Error, String)> {
        // The code of the method
        println!(
            "The DBus socket where the message came from: {}",
            dbus.get_address()
        );
        // ...
        Ok(())
    }

    async fn get_property(
        &mut self,
        _dbus: &DBus,
        _msg_header: &MessageHeader,
    ) -> Result<String, (Error, String)> {
        Ok(self.property.clone())
    }

    async fn set_property(
        &mut self,
        _dbus: &DBus,
        _msg_header: &MessageHeader,
        new_value: String,
    ) -> Result<(), (Error, String)> {
        self.property = new_value;
        Ok(())
    }
}

#[tokio::main]
async fn main() {
    let (dbus, _connection_join_handle) = DBus::session(true)
        .await
        .expect("failed to get the DBus object");
    // Create the object
    let dbus_object = DBusObject {
        property: "".to_string(),
    };
    let object_path = "/org/example/object/path".try_into().unwrap();
    // Bind the same object to the second object path
    dbus_object
        .bind(dbus, object_path)
        .await
        .expect("Something went wrong");
}

DBus ↔️ Rust类型

以下表格显示了类型转换的工作方式

名称 DBus Rust
字节 y u8
布尔值 b bool
有符号16位整数 n i16
无符号16位整数 q u16
有符号32位整数 i i32
无符号32位整数 u u32
有符号32位整数 x i64
无符号32位整数 t u64
IEEE 754双精度浮点数 d f64
无符号32位整数文件描述符 h std::os::unix::io::RawFd
字符串 s 字符串
对象路径 o 字符串
签名 o 字符串
数组 aT Vec<T>
结构 (T1T2..) (T1, T2, ..)
字典条目 {T1T2} (T1, T2)

示例

以下表格显示了类型容器类型转换的工作方式

名称 DBus Rust
数组 ay Vec<u8>
结构 (isi) (i32, 字符串, i32)
字典条目 {ys} (u8, 字符串)

依赖项

~1.5MB
~37K SLoC