Пример корневого пути с деформацией?

Это пример ржавой деформации для новичков. Это должно быть очень просто, но сейчас я чувствую себя супер-глупым.

use warp::Filter;

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .map(|name| format!("Hello, {}!", name));

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

Я хотел бы запустить это на корневом пути, определенном следующим образом:

let hello = warp::path!("" /).map(|| "Hello!");

Но макрос не принимает пустой путь. Я получаю сообщение об ошибке:

no rules expected the token `start`

Я думаю, что супер просто означает разные вещи для разных людей.

Приложение:

Итак, я попробовал решение, упомянутое Иваном C (комментарий ниже) из здесь Это тоже не работает. Применение этого решения

let hello = warp::path::end().map(|name| format!("Hello"));

Приводит, в свою очередь, к этому сообщению об ошибке:

   [rustc E0599] [E] no method named `map` found for opaque type `impl warp::Filter+std::marker::Copy` in the current scope
method not found in `impl warp::Filter+std::marker::Copy`
note: the method `map` exists but the following trait bounds were not
satisfied: `impl warp::Filter+std::marker::Copy: std::iter::Iterator`

Похоже, что маршрутизация с путями деформации работает только в том случае, если не нужен корневой маршрут, который просто ограничивает показ.


person LongHike    schedule 28.12.2020    source источник
comment
Попробуй путь! макрос без аргументов. stackoverflow.com/questions/63003414/   -  person Ivan C    schedule 28.12.2020


Ответы (1)


Это не компилируется:

let hello = warp::path::end()
    .map(|name| format!("Hello"));

Потому что откуда взялся бы аргумент name в вашем закрытии, если вы больше не динамически сопоставляете ни одну часть пути маршрута? Если вы удалите неиспользуемый аргумент name, а format! также не нужен, то он сработает:

use warp::Filter;

#[tokio::main]
async fn main() {
    let hello = warp::path::end()
        .map(|| "Hello");

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

Посещение http://127.0.0.1:3030 теперь дает Hello.

person pretzelhammer    schedule 28.12.2020
comment
Мне стыдно :-( - person LongHike; 28.12.2020