#dbus #ipc #zbus #api-bindings #type-safety

zbus-lockstep

保持类型与 DBus XML 定义同步

12 个不稳定版本 (3 个重大更新)

0.4.4 2024年3月18日
0.4.3 2024年3月18日
0.4.0 2024年2月19日
0.3.1 2023年10月2日
0.1.0 2023年8月8日

#1 in #type-safety

Download history 29/week @ 2024-04-20 122/week @ 2024-04-27 1/week @ 2024-05-04 14/week @ 2024-05-11 117/week @ 2024-05-18 62/week @ 2024-05-25 45/week @ 2024-06-01 77/week @ 2024-06-08 171/week @ 2024-06-15 333/week @ 2024-06-22 181/week @ 2024-06-29 13/week @ 2024-07-06 27/week @ 2024-07-13 11/week @ 2024-07-20 85/week @ 2024-07-27 11/week @ 2024-08-03

每月135 次下载
用于 5 个 crate (2 个直接使用)

MIT 许可证

51KB
708

zbus-lockstep

CI Maintenance crates-io api-docs

zbus-lockstep 帮助保持类型定义与 DBus XML 描述同步,使用 zbus-xml

它提供了匹配您的类型签名的方法 - <T as zvariant::Type>::signature() - 与从 DBus XML 文件检索到的相应签名。

这样,zbus-lockstep 防止定义漂移。

动机

在通过 DBus 进行 IPC 的背景下 - 尤其是当存在多个服务器和/或客户端实现时 - 每个实现都必须发送其他人期望的内容,并且期望与通过总线发送的内容相一致。

XML 协议描述可以作为所有实现者的共享参考框架或“所有真相的单一来源”。有一个单一的参考点有助于所有实现者满足对协议符合性的期望。

保持您通过 DBus 发送的类型与当前有效的协议描述同步将减少误解或通信失败的机会。

用法

zbus-lockstep 添加到 Cargo.toml 的 dev-dependencies

[dev-dependencies]
zbus-lockstep = "0.4.4"

考虑以下 XML 描述,一个具有单个信号的接口。

<node>
  <interface name="org.example.Node">

    <signal name="RemoveNode">
      <arg name="nodeRemoved" type="(so)"/>
    </signal>

  </interface>
</node>

我们的实现中的类型可能看起来像这样

#[derive(Type)]
struct Node {
    name: String,
    path: OwnedObjectPath,
}

此示例中的 derive 宏实现了 zvariant::Type。这意味着我们现在可以调用 <Node as Type::signature(),它将返回类型的 zvariant::Signature

下面的测试显示了如何根据我们对类型的了解使用 zbus-lockstep

    use zbus_lockstep;

    #[test]
    fn test_get_signal_body_type_remove_node() {
        let xml = PathBuf::from("../xml/test_definition_file.xml");
        let iface = "org.example.Node";
        let member = "RemoveNode";

        let signature = get_signal_body_type(xml, iface, member, None).unwrap();
        assert_eq!(signature, Signature::from_str_unchecked("(so)"));
    }

除了功能外,还提供了宏,如果已知定义的路径,可以更简洁地检索签名。

#[test]
fn macro_retrieve_signal_body_remove_node() {
std::env::set_var("LOCKSTEP_XML_PATH", "../xml");
use zbus_lockstep;

let sig = signal_body_type_signature!("RemoveNode");
assert_eq!(sig, zvariant::Signature::from_str_unchecked("(so)"));       
}

注意

当使用XML描述作为参考点时,您应确保使用的描述总是最新的。

自动同步更为理想。

致谢

这个crate最初是Tait Hoyem的zbus-xml-match的分支。

许可证

MIT

依赖项

~4.5MB
~82K SLoC