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 操作系统

Download history 17524/week @ 2024-03-14 15984/week @ 2024-03-21 15461/week @ 2024-03-28 18743/week @ 2024-04-04 19305/week @ 2024-04-11 21779/week @ 2024-04-18 25801/week @ 2024-04-25 28433/week @ 2024-05-02 24244/week @ 2024-05-09 20658/week @ 2024-05-16 19643/week @ 2024-05-23 27110/week @ 2024-05-30 20668/week @ 2024-06-06 22294/week @ 2024-06-13 19391/week @ 2024-06-20 17644/week @ 2024-06-27

84,647每月下载量
用于 2 crate

MIT/Apache

92KB
2K SLoC

varlink

varlink crate提供了使用varlink协议实现客户端和服务器支持。

有关varlink的更多信息,请参阅http://varlink.org

Build Status Crate

更多信息


lib.rs:

服务器客户端支持varlink协议

服务器

要在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