extern crate hyper;
extern crate futures;
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
use futures::future::Future;
use futures::Stream;
use hyper::{Method, StatusCode, Chunk};
use hyper::server::{Http, Request, Response, Service};
pub mod rel;
use rel::*;
struct Worker;
fn reverse(chunk: Chunk) -> Response {
let body_bytes = chunk.iter()
.cloned()
.collect::<Vec<u8>>();
match String::from_utf8(body_bytes.clone()) {
Ok(json_str) => {
let rel: Rel = serde_json::from_str(&json_str).unwrap();
println!("Plan: {:?}", rel);
Response::new()
.with_body(body_bytes)
},
_ => panic!()
}
}
impl Service for Worker {
type Request = Request;
type Response = Response;
type Error = hyper::Error;
type Future = Box<Future<Item=Self::Response, Error=Self::Error>>;
fn call(&self, req: Request) -> Self::Future {
match req.method() {
&Method::Post => {
Box::new(
req.body()
.concat2()
.map(reverse)
)
},
_ => {
Box::new(futures::future::ok(
Response::new().with_status(StatusCode::NotFound)
))
}
}
}
}
fn main() {
let addr = "127.0.0.1:8080".parse().unwrap();
println!("Worker listening on {}", addr);
let server = Http::new().bind(&addr, || Ok(Worker)).unwrap();
server.run().unwrap();
}