extern crate pemmican;
extern crate hyper;
extern crate futures;
extern crate chashmap;
use std::io::Error as IoError;
use std::sync::Arc;
use futures::Future;
use hyper::{Method, StatusCode};
use pemmican::{Pemmican, Config, PluginData, Plugin};
use pemmican::plugins::PageVisits;
struct State {
page_visits: Arc<PageVisits>,
}
struct MyRouter;
impl Plugin<State,IoError> for MyRouter {
fn handle(&self, mut data: PluginData<State>)
-> Box<Future<Item = PluginData<State>, Error = IoError>>
{
match (data.request.path(), data.request.method()) {
("/", &Method::Get) => home(data),
_ => {
data.response.set_status(StatusCode::NotFound);
Box::new(futures::future::ok( data ))
}
}
}
}
fn home(mut data: PluginData<State>)
-> Box<Future<Item = PluginData<State>, Error = IoError>>
{
if let Some(c) = data.shared.state.page_visits.get( data.request.uri().as_ref() )
{
data.response.set_body(
format!("This page has been accessed {} times.\n", c));
} else {
data.response.set_body(
format!("We dont know how many times this page has been accessed.\n"));
}
data.response.set_status(StatusCode::Ok);
Box::new( futures::future::ok( data ) )
}
#[test]
fn main()
{
let page_visits = Arc::new(PageVisits::new());
let state = State {
page_visits: page_visits.clone()
};
let pemmican = Pemmican::new(
Config::default(),
vec![
Arc::new(Box::new(page_visits)),
Arc::new(Box::new(MyRouter))
],
state
);
let _ = pemmican.run("127.0.0.1:3000",
futures::future::ok(()) );
}