Для реализации BeforeMiddleware требуется реализация core::ops::Fn

Я пытаюсь реализовать BeforeMiddleware черта для struct Я имею. Я написал следующий код:

impl BeforeMiddleware for Auth {
    fn before(&self, _: &mut Request) -> IronResult<()> {
        println!("before called");
        Ok(())
    }

    fn catch(&self, _: &mut Request, err: IronError) -> IronResult<()> {
        println!("catch called");
        Err(err)
    }
}

Я получаю следующую ошибку:

> cargo build
...
src/handlers/mod.rs:38:11: 38:28 error: the trait `for<'r, 'r, 'r> core::ops::Fn<(&'r mut iron::request::Request<'r, 'r>,)>` is not implemented for the type `auth::Auth` [E0277]
src/handlers/mod.rs:38     chain.link_before(auth);
                                 ^~~~~~~~~~~~~~~~~
src/handlers/mod.rs:38:11: 38:28 help: run `rustc --explain E0277` to see a detailed explanation
src/handlers/mod.rs:38:11: 38:28 error: the trait `for<'r, 'r, 'r> core::ops::FnOnce<(&'r mut iron::request::Request<'r, 'r>,)>` is not implemented for the type `auth::Auth` [E0277]
src/handlers/mod.rs:38     chain.link_before(auth);
                                 ^~~~~~~~~~~~~~~~~
src/handlers/mod.rs:38:11: 38:28 help: run `rustc --explain E0277` to see a detailed explanation
error: aborting due to 2 previous errors
...

Но в документации сказано link_before функция требует BeforeMiddleware только.

Кто-нибудь знает, почему я вижу эту ошибку и как ее исправить?

РЕДАКТИРОВАТЬ:

Я на самом деле использовал статический authпосле того, как он стал нестатичным, проблема исчезла.

1 ответ

Решение

Это работает просто отлично:

extern crate iron;

use iron::{Chain, BeforeMiddleware, IronResult, Request, Response, IronError};
use iron::status;

struct Auth;

impl BeforeMiddleware for Auth {
    fn before(&self, _: &mut Request) -> IronResult<()> {
        println!("before called");
        Ok(())
    }

    fn catch(&self, _: &mut Request, err: IronError) -> IronResult<()> {
        println!("catch called");
        Err(err)
    }
}

fn main() {
    fn hello_world(_: &mut Request) -> IronResult<Response> {
        Ok(Response::with((status::Ok, "Hello World!")))
    }

    let mut c = Chain::new(hello_world);
    let auth = Auth;
    c.link_before(auth);
}

Это компилируется против железа 0.2.6.

Другие вопросы по тегам