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