Не удается получить доступ к параметрам в железе, потому что привязанный к трейту plugin::Plugin‹iron::Request› не удовлетворен

Я изучаю возможности веб-фреймворка Iron. Насколько я понял, ядро ​​Iron не имеет API для обработки параметров HTTP, поэтому я попытался использовать крейт params.

error: the trait bound `params::Params: plugin::Plugin<iron::Request<'_, '_>>` is not satisfied [E0277]
    let map = req.get_ref::<Params>().unwrap();
                  ^~~~~~~
help: run `rustc --explain E0277` to see a detailed explanation

Я не нашел следов этой ошибки и понятия не имею, как ее исправить.

extern crate iron;
extern crate params;

use iron::prelude::*;
use iron::status;
use params::*; //{self, Params, Value};

fn handle_user(req: &mut Request) -> IronResult<Response> {
    use params::{Params, Value};

    let map = req.get_ref::<Params>().unwrap();

    match map.find(&["user", "name"]) {
        Some(&Value::String(ref name)) if name == "Marie" => {
            Ok(Response::with((iron::status::Ok, "Welcome back, Marie!")))
        },
        _ => Ok(Response::with(iron::status::NotFound)),
    }
}

fn main() {   
    Iron::new(handle_user).http("localhost:2330").unwrap();
}

Версии библиотек

iron = "0.4.0"
params = "0.2.2"

person Daneel Yaitskov    schedule 14.07.2016    source источник
comment
Это известная проблема в Iron и Params.   -  person Shepmaster    schedule 14.07.2016


Ответы (1)


Крейт params 0.2.2 зависит от iron ^0.3, поэтому вам нужно изменить версию зависимости от железа на 0.3.

При использовании такого ящика плагинов вы должны убедиться, что версии точно совпадают. Иногда также может понадобиться cargo update.


В Rust одни и те же структуры или трейты, взятые из нескольких версий одного и того же ящика, рассматриваются как совершенно разные. Обычно это приводит к ошибке типа «ожидалось Pixel, но найдено Pixel» или отсутствовали реализации признаков, как в вашем случае.

person krdln    schedule 14.07.2016