Не удается получить поток событий Rocket! для работы с заимствованными значениями

rust #rust-rocket

#Ржавчина #rust-rocket

Вопрос:

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

Я пытаюсь настроить соединение SSE, и я хочу, чтобы макрос заимствовал значения, которые передаются в функцию.

Сначала я следовал их руководству по настройке SSES и написал следующий код…

 #[get("/my/stream")]
pub fn my_stream(config: amp;State<config::Config>, _pool: amp;State<Pool<Sqlite>>) -> EventStream![] {
    EventStream! {
        let mut id = 0;
        let mut interval = time::interval(Duration::from_secs(1));
        loop {
            yield Event::data("test data").event("test").id(id.to_string());
            interval.tick().await;
            id  = 1;
        }
    } 
}
 

Это компилируется и отлично работает, но когда я пытаюсь сделать что-то простое и заимствую либо config, либо _pool, тогда он жалуется на время жизни в макросе. Компилятор был довольно понятным и соответствовал тому, что у них было в документации. Поэтому я добавил время жизни к возвращаемому значению.

 #[get("/my/stream")]
pub fn my_stream(config: amp; State<config::Config>, _pool: amp;State<Pool<Sqlite>>) -> EventStream![Event   '_] {
    EventStream! {
        let _test = config.database.clone();
        let mut id = 0;
        let mut interval = time::interval(Duration::from_secs(1));
        loop {
            yield Event::data("test data").event("test").id(id.to_string());
            interval.tick().await;
            id  = 1;
        }
    } 
}
 

Однако, как только я это делаю, он жалуется, что событие не является признаком …? Я просмотрел их источник и не вижу события как признака. Что я делаю не так и почему? Последняя ошибка, которую я получаю…

  pub fn my_stream(config: amp; State<config::Config>, _pool: amp;State<Pool<Sqlite>>) -> EventStream![Event   '_] {
   |                                                                                                ^^^^^ not a trait
   |
help: ` ` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way
  --> src/api/mod.rs:24:104
 
 This is the output of cargo tree --depth 1
├── clap v2.27.1
├── rocket v0.5.0-rc.1
│   [build-dependencies]
├── serde v1.0.130
├── serde_json v1.0.66
├── sqlx v0.5.9
└── tokio v1.9.0
 

Комментарии:

1. Event '_ когда Event не является признаком, недопустимый синтаксис, но поскольку он находится внутри макроса, от него зависит, допустимо ли использование или нет. Хотя это определенно выглядит правильно в документации .

2. просто любопытно, работает ли это, если вы удалите _pool параметр?

3. @kmdreko — Удаление пула не заставляет его работать.

4. можете ли вы предоставить свои Cargo.toml зависимости и / или выходные cargo tree --depth 1 данные, чтобы мы могли видеть точные версии, которые вы используете?

5. @kmdreko Конечно, я прикрепил вывод дерева грузов -глубина 1 :).