Я пытаюсь заставить асинхронный обработчик работать для маршрута с использованием warp
. Я выполняю некоторые файловые операции с tokio
. Вот небольшой пример:
use tokio::fs::File;
use tokio::prelude::*;
use warp::Filter;
#[tokio::main]
async fn main() {
let route = warp::path!("hello")
.and_then( move || async move {
let bin = File::open("test.txt").await?;
Result::<warp::reply::Json, ServiceError>::Ok(warp::reply::json(vec!("1", "2")))
});
}
#[derive(Debug)]
enum ServiceError{
IoError(io::Error)
}
impl warp::reject::Reject for ServiceError {}
impl std::convert::From<std::io::Error> for ServiceError {
fn from(error: io::Error) -> Self{
ServiceError::IoError(error)
}
}
Вам понадобиться:
[dependencies]
tokio = { version = "0.2", features = ["full", "fs"] }
warp = "0.2"
Ошибка возникает в .and_then( move || async move {
:
the trait bound `ServiceError: warp::reject::sealed::CombineRejection<warp::Rejection>` is not satisfied
Эта черта запечатана, поэтому я не смог бы ее реализовать, даже если бы захотел. Я бы подумал, что реализации warp::reject::Reject for ServiceError
было бы достаточно. Я не знаю, как обойти это.
Я нашел этот ответ, который предлагает возможное решение, но я бы хотел по возможности оставаться на официальных релизах.
Я действительно хотел бы использовать ?
, если это возможно, и мои исследования заставляют меня поверить в то, что я могу. Использование map_error
, по-видимому, является альтернативой, но гораздо более громоздко, особенно с несколькими вызовами асинхронных файловых функций.