Внедрение зависимостей в Rust Warp - PullRequest
0 голосов
/ 06 марта 2020

Как добавить зависимости в мои обработчики маршрутов в Warp? Тривиальный пример заключается в следующем. У меня есть маршрут, по которому я хочу передать значение stati c, которое определяется во время запуска, но фильтр передает значения в конечный обработчик. Как передать дополнительные данные без создания глобальных переменных? Это было бы полезно для внедрения зависимости.

pub fn root_route() -> BoxedFilter<()> {
    warp::get().and(warp::path::end()).boxed()
}

pub async fn root_handler(git_sha: String) -> Result<impl warp::Reply, warp::Rejection> {
    Ok(warp::reply::json(
        json!({
             "sha": git_sha
        })
            .as_object()
            .unwrap(),
    ))
}


#[tokio::main]
async fn main() {
    let git_sha = "1234567890".to_string();
    let api = root_route().and_then(root_handler);
    warp::serve(api).run(([0,0,0,0], 8080)).await;
}

1 Ответ

0 голосов
/ 06 марта 2020

Вот простой пример. Используя .and() в сочетании с .map(move ||), вы можете добавить параметры в кортеж, которые будут переданы в функцию окончательного обработчика.

use warp::filters::BoxedFilter;
use warp::Filter;
#[macro_use]
extern crate serde_json;

pub fn root_route() -> BoxedFilter<()> {
    warp::get().and(warp::path::end()).boxed()
}

pub async fn root_handler(git_sha: String) -> Result<impl warp::Reply, warp::Rejection> {
    Ok(warp::reply::json(
        json!({
             "sha": git_sha
        })
            .as_object()
            .unwrap(),
    ))
}

pub fn with_sha(git_sha: String) -> impl Filter<Extract = (String,), Error = std::convert::Infallible> + Clone {
    warp::any().map(move || git_sha.clone())
}

#[tokio::main]
async fn main() {
    let git_sha = "1234567890".to_string();
    let api = root_route().and(with_sha(git_sha)).and_then(root_handler);
    warp::serve(api).run(([0,0,0,0], 8080)).await;
}
...