stuck 0.4.1

Multi-threading scheduled task facility building on cooperative stackful coroutine
Documentation
use std::io::{Read, Result, Write};
use std::net::SocketAddr;
use std::str::FromStr;

use stuck::{net, task};

fn echo(mut stream: net::TcpStream) -> Result<()> {
    let mut buf = Vec::with_capacity(1024);
    unsafe { buf.set_len(buf.capacity()) };
    loop {
        match stream.read(&mut buf)? {
            0 => break,
            n => stream.write_all(&buf[..n])?,
        }
    }
    Ok(())
}

#[stuck::main]
fn main() -> Result<()> {
    let addr = SocketAddr::from_str("127.0.0.1:0").unwrap();
    let mut listener = net::TcpListener::bind(addr)?;
    let port = listener.local_addr().unwrap().port();
    eprintln!("Listen on port: {}", port);
    let mut id_counter = 0;
    while let Ok((stream, remote_addr)) = listener.accept() {
        id_counter += 1;
        let id = id_counter;
        task::spawn(move || {
            eprintln!("{:010}[{}]: serving", id, remote_addr);
            match echo(stream) {
                Ok(_) => eprintln!("{:010}[{}]: closed", id, remote_addr),
                Err(err) => eprintln!("{:010}[{}]: {:?}", id, remote_addr, err),
            }
        });
    }
    Ok(())
}