rustun 0.1.4

A library for implementing STUN server and client asynchronously
Documentation
extern crate clap;
#[macro_use]
extern crate slog;
extern crate slog_term;
extern crate fibers;
extern crate rustun;

use clap::{App, Arg};
use slog::{Logger, DrainExt, Record, LevelFilter};
use fibers::{Executor, InPlaceExecutor, Spawn};
use rustun::server::UdpServer;
use rustun::rfc5389::handlers::BindingHandler;

fn main() {
    let matches = App::new("rustun_srv")
        .arg(Arg::with_name("PORT")
            .short("p")
            .long("port")
            .takes_value(true)
            .required(true)
            .default_value("3478"))
        .get_matches();

    let port = matches.value_of("PORT").unwrap();
    let addr = format!("0.0.0.0:{}", port).parse().expect("Invalid UDP address");

    let place_fn = |info: &Record| format!("{}:{}", info.module(), info.line());
    let logger = Logger::root(LevelFilter::new(slog_term::streamer().build(), slog::Level::Info)
                                  .fuse(),
                              o!("place" => place_fn));

    let mut executor = InPlaceExecutor::new().unwrap();
    let spawner = executor.handle();
    let monitor = executor.spawn_monitor(UdpServer::new(addr)
        .start(spawner.boxed(), BindingHandler::with_logger(logger)));
    let result = executor.run_fiber(monitor).unwrap();
    println!("RESULT: {:?}", result);
}