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 implementsFnMut