无法在 FromRequest 实现中触发 Outcome::Failure

Cannot trigger Outcome::Failure in FromRequest implementation

在尝试开始使用 Rocket 开发 api 时,我正在实施一个请求守卫,它应该检查授权 headers。当检查失败时,它应该导致失败,但那是我无法让它工作的地方。 Outcome::Success 工作得很好,return 是正确的 object,但是当触发 Outcome::Failure 时,我总是 运行 遇到无法编译的问题:

error[E0282]: type annotations needed
  --> src/main.rs:43:21
   |
43 |                     Outcome::Failure((Status::BadRequest, RequestError::ParseError));
   |                     ^^^^^^^^^^^^^^^^ cannot infer type for type parameter S declared on the enum Outcome

重现

main.rs

#[macro_use] extern crate rocket;

use rocket::Request;
use rocket::request::{FromRequest, Outcome};
use rocket::http::Status;
use regex::Regex;

#[get("/")]
fn index() -> &'static str {
    "Hello, world!"
}

#[get("/test")]
fn test(device: Device) -> &'static str {
    "Hello test"
}

#[derive(Debug)]
enum RequestError {
    InvalidCredentials,
    ParseError,
}

struct Device {
    id: i32
}

#[rocket::async_trait]
impl<'r> FromRequest<'r> for Device {
    type Error = RequestError;
    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {

         Outcome::Failure((Status::BadRequest, RequestError::ParseError));

        // TEST
        let d1 = Device {
            id: 123
        };
        Outcome::Success(d1)
    }
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![index,test])
}

Cargo.toml

[package]
name = "api-sandbox"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rocket = "0.5.0-rc.1"
regex = "1"

预期行为

参数S应该不需要声明,因为我没有使用参数Success(S),而是使用了Failure(E)。根据文档,我可以 return 错误或带有状态和错误的元组,但错误消息会弹出。我已经仔细检查了可用的资源和博客,但无法正确触发状态失败的结果。

环境:

VERSION="20.04.3 LTS (Focal Fossa)"

5.10.60.1-microsoft-standard-WSL2

火箭 0.5.0-rc.1

我对这个话题很陌生,所以如果我需要提供更多信息,请告诉我。感谢您对此主题的帮助

无法推导出Outcome::Failure(_)的类型。即使没有在这个特定的构造中使用,类型参数 S 也必须是已知的 才能成为一个完整的类型。没有可用的默认类型或任何可以帮助推断 S.

类型的上下文

Outcome::Success(_)也是如此。就其本身而言,模板参数 E 的类型是未知的。但是,这会编译,因为它 确实 具有可以帮助编译器推断它的上下文。它作为return值使用,所以它必须匹配return类型,因此可以推导出ESelf::Error

如果它被用作 return 值,这也适用于 Outcome::Failure(_)

async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
    Outcome::Failure((Status::BadRequest, RequestError::ParseError))
}