从 Rust 闭包返回错误并满足类型

时间:2021-02-10 12:10:35

标签: rust closures

我在使用 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)

任何建议表示赞赏:)

1 个答案:

答案 0 :(得分:3)

错误类型不同,只需映射错误以获得实际需要的类型:

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 也可能对映射错误类型很有趣。