#[macro_use] extern crate log;
extern crate env_logger;
extern crate tungstenite;

use std::net::{TcpListener, TcpStream};
use std::thread::spawn;

use tungstenite::server::accept;
use tungstenite::error::Result;
use tungstenite::handshake::Handshake;

fn handle_client(stream: TcpStream) -> Result<()> {
    let mut socket = accept(stream).handshake_wait()?;
    loop {
        let msg = socket.read_message()?;
        socket.write_message(msg)?;
    }
}

fn main() {
    env_logger::init().unwrap();

    let server = TcpListener::bind("127.0.0.1:9001").unwrap();

    for stream in server.incoming() {
        spawn(move || {
            match stream {
                Ok(stream) => match handle_client(stream) {
                    Ok(_) => (),
                    Err(e) => warn!("Error in client: {}", e),
                },
                Err(e) => warn!("Error accepting stream: {}", e),
            }
        });
    }
}