38个版本 (稳定版)
| 11.0.1 | 2021年3月9日 |
|---|---|
| 11.0.0 | 2020年6月3日 |
| 10.0.0 | 2019年11月14日 |
| 8.1.0 | 2019年5月15日 |
| 0.4.0 | 2018年3月29日 |
#541 in 操作系统
84,647每月下载量
用于 2 crate
92KB
2K SLoC
varlink
varlink crate提供了使用varlink协议实现客户端和服务器支持。
有关varlink的更多信息,请参阅http://varlink.org。
更多信息
lib.rs:
服务器
要在Rust中创建varlink服务器,请将您的varlink接口定义文件放在src/目录下。例如:src/org.example.ping.varlink
interface org.example.ping
method Ping(ping: string) -> (pong: string)
然后在您的项目目录中创建一个build.rs文件
extern crate varlink_generator;
fn main() {
varlink_generator::cargo_build_tosource("src/org.example.ping.varlink",
/* rustfmt */ true);
}
有关更多代码生成函数,请参阅generator functions。
将以下内容添加到您的Cargo.toml
[package]
build = "build.rs"
[build-dependencies]
varlink_generator = "<version>"
在您的main.rs中,您可以使用
mod org_example_ping;
然后实现接口
struct MyOrgExamplePing;
impl VarlinkInterface for MyOrgExamplePing {
fn ping(&self, call: &mut dyn Call_Ping, ping: String) -> Result<()> {
return call.reply(ping);
}
}
以实现接口方法。
如果您的varlink方法名为TestMethod,则要实现的Rust方法名为test_method。第一个参数是类型为Call_TestMethod,它具有reply()的方法。
fn test_method(&self, call: &mut dyn Call_TestMethod, /* more arguments */) -> Result<()> {
/* ... */
return call.reply( /* more arguments */ );
}
典型的服务器创建一个VarlinkService并通过varlink::listen
#
#
let args: Vec<_> = std::env::args().collect();
let myorgexampleping = MyOrgExamplePing;
let myorgexampleping_interface = org_example_ping::new(Box::new(myorgexampleping));
let service = varlink::VarlinkService::new(
"org.varlink",
"test service",
"0.1",
"http://varlink.org",
vec![
Box::new(myorgexampleping_interface),
// more interfaces ...
],
);
varlink::listen(service, &args[1],
&varlink::ListenConfig {
idle_timeout: 1,
..Default::default()
},
);
其中args[1]将遵循varlink 地址规范。
目前支持的地址URI是
- TCP
tcp:127.0.0.1:12345域名/IP地址和端口 - UNIX 套接字
unix:/run/org.example.ftl可选访问;mode=0666参数 - UNIX 抽象命名空间套接字
unix:@org.example.ftl(仅在 Linux 上)
客户端
设置您的项目,就像在 服务器 的情况下,使用一个 varlink 文件和一个 build.rs 文件。
在您的main.rs中,您可以使用
mod org_example_ping;
use org_example_ping;
let connection = Connection::with_address("unix:/tmp/org.example.ping").unwrap();
let mut ping_service = org_example_ping::VarlinkClient::new(connection);
let reply = ping_service.ping(String::from("Test")).call()?;
assert_eq!(String::from("Test"), reply.pong);
可以通过 连接构建器 函数建立连接。`org_example_ping::VarlinkClient` 实现 `org_example_ping::VarlinkClientInterface`,它具有所有的 varlink 方法(名称从驼峰式转换为小写蛇形)。`PingString()` 方法将被命名为 `ping_string()`。
要迭代一个 more 调用
for reply in my_more_service.test_more(/* params */).more()? { /*...*/ }
回复结构体放置在以方法命名的结构体中,并在后面附加 `_Reply`。因此,我们示例中 `Ping()` 方法的回复在一个名为 `Ping_Reply` 的结构体中。
依赖项
~2–12MB
~145K SLoC