#protobuf #proc-macro #embedding #tagless #request-response #let #simplize-rpc-params

nightly power-protobuf

一种用于在Rust代码中嵌入protobuf的进程宏

11个版本

0.1.11 2024年4月24日
0.1.10 2024年4月23日

#324 in 进程宏

Download history 257/week @ 2024-04-15 1126/week @ 2024-04-22 4/week @ 2024-04-29 5/week @ 2024-05-20

每月413次下载

MIT许可证

160KB
4K SLoC

protobuf!

power_protobuf是一个进程宏,让您能够直接以这种方式在Rust源代码中编写protobuf!

protobuf! {
  syntax = "proto3";

  package helloworld;

  option java_multiple_files = true;
  option java_package = "io.grpc.examples.helloworld";
  option java_outer_classname = "HelloWorldProto";

  // The greeting service definition.
  service Greeter {
    // Sends a greeting
    rpc SayHello ({
      // 'simplize_rpc_params' feature simplize to define Request/Response messages for rpc
      string name
    }) returns (HelloReply) {}
  }

  // The response message containing the greetings
  message HelloReply {
    string message // 'tagless' feature omit to assign tag number at design stage, it will do auto-increment as by refering previous number
  }
}

功能

支持proto2和proto3

目前支持的所有protobuf版本(2到3)。

protobuf!还允许您不必显式声明版本,它将默认解析为proto3语法

将包名转换为Rust内部模块

如果定义了package,它将生成当前源文件中的Rust mod。反之,如果未定义,它将扩展到当前位置。

支持无标记

使用protobuf!,您可以编写如下协议

message A {
  int32 field1,
  string field2,

  repeated string field10 = 10,
  string field11
  sfix32 field12
}

字段field1、field2、field11、field12的标记将自动分配为'1'、'2'、'11'、'12'。

支持直接定义rpc请求/响应消息类型

为多个rpc方法定义Request和Response消息类型有时会是冗余的工作。

protobuf!提供了一个简化此过程的选项

  service Greeter {
    rpc SayHello ({
      string name
    }) returns (HelloReply) {}
  }

消息SayHelloRequest将生成如{}中定义的字段。请求/响应的类型名称结合了rpc名称和后缀(Request/Response)使用大驼峰命名法。

支持跨多个.rs文件进行类型引用

protobuf!让您能够轻松地在其他protobuf定义中使用外部类型。它将通过读取相应的.rs文件来检查字段的类型。

FIXME:此文档后面将介绍更多细节。

支持tonic grpc堆栈

启用功能impl_prost以使用prost/tonic堆栈扩展代码。

impl_prost功能默认启用。

当前状态

功能 进度
proto2和proto3语法 完成
无标记 完成
请求/响应参数类型自由 完成
支持prost 部分
支持 rust-protobuf 尚未支持
流支持 尚未支持

依赖

~2.8–4MB
~71K SLoC