Rust 从锈蚀闭合返回错误并获得满意的类型
在使用lambda_http板条箱时,我很难获得返回正确类型的闭包。我的修订代码如下所示:Rust 从锈蚀闭合返回错误并获得满意的类型,rust,closures,Rust,Closures,在使用lambda_http板条箱时,我很难获得返回正确类型的闭包。我的修订代码如下所示: 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()
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.
});
}
欢迎任何建议:错误类型不同,只需映射错误即可获得实际需要的类型: fn主->结果{ lambda!| e:Request,_c:Context |{ 让mut response=response::builder; 让我的身体=向量::新; 回答.body my_body.map_err | err |{ HandlerError::从 格式!实际使用您的错误而不是此错误:{:?},err.as_str, } }; 好啊 }
对于映射错误类型,从实现可能也很有趣。错误类型不同,只需映射错误即可获得实际需要的类型: fn主->结果{ lambda!| e:Request,_c:Context |{ 让mut response=response::builder; 让我的身体=向量::新; 回答.body my_body.map_err | err |{ HandlerError::从 格式!实际使用您的错误而不是此错误:{:?},err.as_str, } }; 好啊 }
对于映射错误类型来说,从实现可能也很有趣。Okresponse.bodymy\u body?如果已经有一个From支持转换正确的类型,那么它会起作用。@trentcl在我看来?上面打开它,然后确定。。。重新包装它,简单地返回响应是否会更整洁。body my_body?当然谢谢你的建议:@Chris我想它看起来确实有点奇怪,但是?使用“从”展开并转换错误类型。结果如何?in terminal position不等同于普通结果,而是近似于结果。map|err | e | From::frome.Okresponse.bodymy_body?如果已经有一个From支持转换正确的类型,那么它会起作用。@trentcl在我看来?上面打开它,然后确定。。。重新包装它,简单地返回响应是否会更整洁。body my_body?当然谢谢你的建议:@Chris我想它看起来确实有点奇怪,但是?使用“从”展开并转换错误类型。结果如何?in-terminal position不等同于普通结果,而是近似于结果。map_err | e | From::frome。
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)