1

I picked an example from Iron router extension and tried to add a single SHA256 hash generator instance that could be used throughout the lifetime of the server:

extern crate crypto;
extern crate iron;
extern crate router;

use iron::prelude::*;
use iron::status;
use router::Router;

use crypto::digest::Digest;
use crypto::sha2::Sha256;

fn main() {
    let mut sha256 = Sha256::new();
    let mut router = Router::new();
    router.get("/", handler, "index");
    router.get("/:query", handler, "query");

    Iron::new(router).http("localhost:3000").unwrap();

    fn handler(req: &mut Request) -> IronResult<Response> {
        let ref query = req.extensions
            .get::<Router>()
            .unwrap()
            .find("query")
            .unwrap_or("/");

        sha256.input_str("abc123");
        println!("sha: {}", sha256.result_str());
        Ok(Response::with((status::Ok, *query)))
    }
}

When I used it inside the handler, I get the following error:

error[E0434]: can't capture dynamic environment in a fn item; use the || { ... } closure form instead

I tried to change the line the handler from fn to closure like this:

let handler = |req: &mut Request| -> IronResult<Response> {
    let ref query = req.extensions
        .get::<Router>()
        .unwrap()
        .find("query")
        .unwrap_or("/");

    sha256.input_str("abc123");
    println!("sha: {}", sha256.result_str());
    Ok(Response::with((status::Ok, *query)))
};

Then I get a new error:

error[E0525]: expected a closure that implements the Fn trait, but this closure only implements FnMut

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
rusty doe
  • 23
  • 2

0 Answers0