self-meter-http 0.4.1

A http renderer for self-meter crate, easily pluggable into tokio-based, or tk-http-based. May be plugged in any other application using separate thread.
Documentation
extern crate tokio_core;
extern crate futures;
extern crate tk_http;
extern crate tk_listen;
extern crate tk_easyloop;
extern crate self_meter_http;
extern crate env_logger;

#[macro_use] extern crate log;

use std::env;
use std::time::Duration;

use tokio_core::net::{TcpListener};
use futures::{Future, Stream};
use futures::future::{ok};

use tk_http::server::buffered::{BufferedDispatcher};
use tk_http::server::{self, Proto};
use tk_listen::ListenExt;
use tk_easyloop::handle;


fn main() {
    if env::var("RUST_LOG").is_err() {
        env::set_var("RUST_LOG", "info");
    }
    env_logger::init().expect("init logging");

    let meter = self_meter_http::Meter::new();
    meter.track_current_thread_by_name();

    tk_easyloop::run_forever(|| -> Result<(), ()> {
        meter.spawn_scanner(&handle());

        let addr = "0.0.0.0:8080".parse().unwrap();
        let scfg = server::Config::new().done();
        let listener = TcpListener::bind(&addr, &handle()).unwrap();

        tk_easyloop::spawn(listener.incoming()
            .sleep_on_error(Duration::from_millis(100), &handle())
            .map(move |(socket, addr)| {
                let meter = meter.clone();
                Proto::new(socket, &scfg,
                    BufferedDispatcher::new(addr, &handle(), move || {
                        let meter = meter.clone();
                        move |_req, e| ok(meter.respond(e))
                    }),
                    &handle())
                .map_err(|e| { debug!("Connection error: {}", e); })
            })
            .listen(10));
        Ok(())
    }).unwrap();
}