无法在 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类型,因此可以推导出E
是Self::Error
。
如果它被用作 return 值,这也适用于 Outcome::Failure(_)
:
async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
Outcome::Failure((Status::BadRequest, RequestError::ParseError))
}
在尝试开始使用 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类型,因此可以推导出E
是Self::Error
。
如果它被用作 return 值,这也适用于 Outcome::Failure(_)
:
async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
Outcome::Failure((Status::BadRequest, RequestError::ParseError))
}