ferrum 0.2.1

Extensible, Concurrency Focused Web Framework in Rust.
Documentation
extern crate time;
extern crate ferrum;

use std::thread;

use ferrum::*;

enum LoggerMode {
    Silent,
    Tiny,
    Large
}

struct Logger {
    mode: LoggerMode
}

struct LoggerHandler<H: Handler> {
    logger: Logger, handler: H
}

impl Logger {
    fn new(mode: LoggerMode) -> Logger {
        Logger { mode }
    }

    fn log(&self, request: &Request, response: Result<&Response, &FerrumError>, time: u64) {
        match self.mode {
            LoggerMode::Silent => {},
            LoggerMode::Tiny => println!("-> {:?}\n<- {:?}\n{}", request, response, time),
            LoggerMode::Large => println!("Request: {:?}\nResponse: {:?}\nResponse-Time: {}", request, response, time)
        }
    }
}

impl<H: Handler> Handler for LoggerHandler<H> {
    fn handle(&self, request: &mut Request) -> FerrumResult<Response> {
        let entry = time::precise_time_ns();
        let response = self.handler.handle(request);

        self.logger.log(request, response.as_ref(), time::precise_time_ns() - entry);
        response
    }
}

impl AroundMiddleware for Logger {
    fn around(self, handler: Box<Handler>) -> Box<Handler> {
        Box::new(LoggerHandler {
            logger: self,
            handler
        }) as Box<Handler>
    }
}

fn hello_world(_: &mut Request) -> FerrumResult<Response> {
    Ok(Response::new().with_content("Hello World!", mime::TEXT_PLAIN))
}

fn main() {
    println!("Servers listening on 2000, 3000, and 4000");

    thread::spawn(|| {
        Ferrum::new(
            Logger::new(LoggerMode::Silent).around(Box::new(hello_world))
        ).http("localhost:2000").unwrap();
    });

    thread::spawn(|| {
        Ferrum::new(
            Logger::new(LoggerMode::Tiny).around(Box::new(hello_world))
        ).http("localhost:3000").unwrap();
    });

    Ferrum::new(
        Logger::new(LoggerMode::Large).around(Box::new(hello_world))
    ).http("localhost:4000").unwrap();
}