nio 0.1.4

Async runtime for Rust
Documentation
use std::{
    io,
    net::{SocketAddr, ToSocketAddrs},
};

pub fn bind<A, F, T>(addr: A, mut f: F) -> io::Result<T>
where
    A: ToSocketAddrs,
    F: FnMut(SocketAddr) -> io::Result<T>,
{
    let addrs = addr.to_socket_addrs()?;
    let mut last_err = None;
    for addr in addrs {
        match f(addr) {
            Err(err) => last_err = Some(err),
            result => return result,
        }
    }
    Err(last_err.unwrap_or_else(invalid_addr))
}

fn invalid_addr() -> io::Error {
    io::Error::new(
        io::ErrorKind::InvalidInput,
        "could not resolve to any address",
    )
}