我正在尝试使用 crates prost 和 tonic 在 Rust 中构建一个简单的 gRPC 客户端。我的 proto 定义非常简单,但我突然坚持使用从其他 proto 导入的消息。
// file src/protos/types.proto
syntax = "proto3";
package Types;
message Message1 {
uint32 value1 = 1;
bytes value2 = 2;
}
message Message2 {
uint32 value1 = 1;
uint32 value2 = 2;
uint32 value3 = 3;
uint32 value4 = 4;
}
Run Code Online (Sandbox Code Playgroud)
// file src/protos/service.proto
syntax = "proto3";
import "types.proto";
package Service;
service Worker {
rpc Do (Request) returns (Reply);
}
message Request {
Types.Message1 message1 = 1; …Run Code Online (Sandbox Code Playgroud) 我正在制作一个使用 Redis 客户端的基于 Tonic 的 gRPC 微服务。我无法找出发生异步错误时将 a 隐式转换RedisError为 a的示例。tonic::Status
async fn make_transaction(
&self,
request: Request<TransactionRequest>,
) -> Result<Response<TransactionResponse>, Status> {
let mut con = self.client.get_async_connection().await?;
con.set("my_key", 42).await?;
...
}
Run Code Online (Sandbox Code Playgroud)
来自 Redis 客户端的连接可能会失败以及设置失败。我宁愿不使用,.map_err()因为这似乎会破坏异步。
我想我需要实现这个特性From<Status>,From<RedisError>但不知道如何去做。这是我的尝试,但它不起作用,因为 Tonic 想要一个tonic::Status,而不是ApiError我制作的结构:
pub struct ApiError {}
impl From<tonic::Status> for ApiError {
fn from(err: Status) -> ApiError {
ApiError { }
}
}
impl From<RedisError> for Status {
fn from(err: redis::RedisError) -> ApiError { …Run Code Online (Sandbox Code Playgroud) 关于 gRPC codegen 和 tonic(使用 protoc)的问题。
我使用的第三方原型的包名称如下thirdparty.specificpackage,例如:
syntax = "proto3";
package thirdparty.common;
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";
service CommonService {
...
}
Run Code Online (Sandbox Code Playgroud)
和一个build.rs看起来像这样的:
tonic_build::configure()
.protoc_arg("--experimental_allow_proto3_optional") // for older systems
.build_client(true)
.build_server(true)
.out_dir("./src")
.compile(
&[
"src/myprotoproject/protos/services/decision_engine.proto"],
&["src"],
)?;
Run Code Online (Sandbox Code Playgroud)
我生成的代码cargo build被命名thirdparty.common.rs- 如何将其导入到我的 Rust 代码中?
mod thirdparty.common不是有效的 Rust 标识符,因为.- 是否有最佳实践?