Деформация: нельзя использовать? в обработчике асинхронного маршрута

Я пытаюсь заставить асинхронный обработчик работать для маршрута с использованием 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, по-видимому, является альтернативой, но гораздо более громоздко, особенно с несколькими вызовами асинхронных файловых функций.


person Matthew Goulart    schedule 09.10.2020    source источник