23个不稳定版本
0.19.3 | 2023年5月29日 |
---|---|
0.18.0 | 2023年5月23日 |
0.17.0 | 2022年6月27日 |
0.16.1 | 2022年1月17日 |
0.8.3 | 2017年11月7日 |
#607 in 网络编程
205KB
5K SLoC
libstrophe
文档
查看完整文档
用法
将以下内容添加到您的Cargo.toml中
[dependencies]
libstrophe = "0.19.3"
libstrophe - Rust的易用封装
此库为libstrophe(一个XMPP客户端库)提供了高级易用的绑定。
文档
本库的文档仅涵盖Rust特定的部分,在其他情况下,请参考原始库文档。
工作流程
总体工作流程与C库相似。顶级对象是Context
。它包含平台特定的部分,如日志和内存分配,以及用于保持事件持续的事件循环。此Crate使用log
crate提供的功能封装日志(前提是默认启用了rust-log
功能)。内存分配也由Rust原生方式处理。创建Connection
时,它将临时消耗Context
。在完成所有设置后,调用其中一个connect_*()
方法以检索Context
。这样,单个Context
可以连续用于多个Connection
。当您完成对Context
的Connection
设置后,使用run()
或run_once()
方法启动事件循环。
安全性
这个创建尝试尽可能安全。然而,在包装C库时,并不总是可能保证这一点。以下假设可能不一定是真实的,因此可能会引入不安全性
Context
事件循环方法在不改变其状态的情况下借用self
(或更具体地说,具有内部可变性)
此crate中的主要对象被标记为 Send
,因此它们确实应该在线程之间安全地发送。然而,并未对库源代码进行重大调查以确保这一点。
初始化和关闭
不需要调用初始化函数,创建 Context
时会自动执行。但是,当您的应用程序终止时,您可能想调用 shutdown()
函数。但请注意,初始化函数在程序生命周期中只能调用一次,因此调用 shutdown()
后,将无法正确使用库。
回调
crate具有存储回调并拥有它们的能力,因此您可以传递闭包而不用担心在外部存储它们。但是,关于它还有一些需要注意的事情。并不总是可能知道底层库是否接受了回调。无论哪种情况,crate都会在内部保留闭包,尽管它可能永远不会被库调用。您仍然可以使用相应的 *handler_delete()
或 *handler_clear()
方法删除回调。
由于C libstrophe库的实现方式和Rust优化单态化的方式,当您将它们传递给相同的处理程序设置方法时,您的回调实际上必须编译成具有不同地址的不同函数。因此,如果您想传递2个回调 hander_add
,请确保它们的代码是唯一的,并且Rust没有在幕后将它们合并成一个函数。您可以使用 Connection::*handlers_same()
系列函数测试两个回调是否相同。如果返回true,则您只能将其中一个传递给相应的处理程序函数,另一个将被静默忽略。
由于crate使用 userdata
来传递实际的用户回调,因此您不能在回调中使用 userdata
来传递自己的数据。因此,如果您需要在回调调用之间保持状态,则必须使用闭包。
由于主要对象被标记为 Send
,并且我们在其中存储回调,因此所有回调也必须是 Send
。
示例
let connection_handler = |ctx: &libstrophe::Context,
_conn: &mut libstrophe::Connection,
_evt: libstrophe::ConnectionEvent| {
ctx.stop();
};
let ctx = libstrophe::Context::new_with_default_logger();
let mut conn = libstrophe::Connection::new(ctx);
conn.set_jid("[email protected]");
conn.set_pass("password");
let ctx = conn.connect_client(None, None, connection_handler).unwrap();
ctx.run();
libstrophe::shutdown();
有关更完整的示例,请参阅此crate的 src/examples
目录和 libstrophe示例。
crate特性
以下特性被提供
rust-log
- 默认启用,使crate集成到Rust日志工具中libstrophe-0_9_3
- 默认启用,启用针对libstrophe-0.9.3的功能libstrophe-0_10_0
- 默认启用,启用针对libstrophe-0.10.0的功能libstrophe-0_11_0
- 默认启用,启用特定于libstrophe-0.11.0的功能libstrophe-0_12_0
- 默认启用,启用特定于libstrophe-0.12.0的功能buildtime_bindgen
- 强制重新生成绑定,而不是依赖于预生成的源代码
许可证:LGPL-3.0
依赖项
~210–450KB