【发布时间】:2022-03-20 23:43:42
【问题描述】:
我正在制作一个使用 Redis 客户端的基于 Tonic 的 gRPC 微服务。我想不出在发生异步错误时将RedisError 隐式转换为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?;
来自 Redis 客户端的连接和设置一样可能失败。我正在使用使用 Tokio 的异步接口。我宁愿不要map 错误,因为这似乎破坏了异步。
我在想我需要实现 trait 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 {
ApiError { }
}
}
【问题讨论】: