gpt4 book ai didi

rust - 从 rust 封闭返回错误并使类型满意

转载 作者:行者123 更新时间:2023-12-03 11:33:36 25 4
gpt4 key购买 nike

使用lambda_http crate 时,我很难让闭包返回正确的类型。我编写的代码如下所示:

use lambda_http::{lambda, IntoResponse, Request, Response};
use lambda_runtime::{error::HandlerError, Context};
use std::error::Error;
use system_etrainingoz::{handle_request, HandlerRequest};

fn main() -> Result<(), Box<dyn Error>> {
lambda!(|e: Request, _c: Context| {
let mut response = Response::builder();
... my_body is std::vec::Vec<u8>
return response.body(my_body); <-- Problem is here.
// return response.body(my_body)?; <-- This does not work either.
});
}
错误似乎是lambda有多个版本!宏,其中一种支持返回错误,而另一种则不支持,我无法使我的返回错误类型与预期的相符。 response.body返回Result ,因此可能会出错。编译错误如下:
error[E0271]: type mismatch resolving `<[closure@src/bin/lambda.rs:13:13: 27:6] as FnOnce<(lambda_http::http::Request<Body>, lambda_runtime::Context)>>::Output == std::result::Result<_, HandlerError>`
--> src/bin/lambda.rs:13:5
|
13 | / lambda!(|e: Request, _c: Context| {
14 | | let (parts, body) = e.into_parts();
15 | | let handler_request = HandlerRequest {
16 | | parts: parts,
... |
26 | | // return response.body(handled_response.body)?;
27 | | });
| |_______^ expected struct `lambda_http::http::Error`, found struct `HandlerError`
|
::: /Users/chris/.cargo/registry/src/github.com-1ecc6299db9ec823/lambda_http-0.1.1/src/lib.rs:100:25
|
100 | pub fn start<R>(f: impl Handler<R>, runtime: Option<TokioRuntime>)
| ---------- required by this bound in `lambda_http::start`
|
= note: expected enum `std::result::Result<Response<Vec<u8>>, lambda_http::http::Error>`
found enum `std::result::Result<_, HandlerError>`
= note: required because of the requirements on the impl of `lambda_http::Handler<_>` for `[closure@src/bin/lambda.rs:13:13: 27:6]`
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
任何建议表示赞赏:)

最佳答案

错误类型有所不同,只需将错误映射为实际需要的类型即可:

fn main() -> Result<(), Box<dyn Error>> {
lambda!(|e: Request, _c: Context| {
let mut response = Response::builder();
let my_body = Vec::new();
response.body(my_body).map_err(|err| {
HandlerError::from(
format!("Actually use your error instead of this one: {:?}", err).as_str(),
)
})
});
Ok(())
}
对于映射错误类型,实现 From也可能很有趣。

关于rust - 从 rust 封闭返回错误并使类型满意,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66136629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com