i2p 0.0.1

I2P client library with a std::net-like API
Documentation
use std::io;
use std::net::{SocketAddr, ToSocketAddrs};

pub use self::addr::{I2pSocketAddr, ToI2pSocketAddrs};
pub use self::i2p::I2pAddr;
pub use self::streaming::{I2pStream, I2pListener};
pub use self::datagram::I2pDatagramSocket;

mod addr;
mod datagram;
mod i2p;
mod streaming;
#[cfg(test)]
mod test;

fn each_addr<A: ToSocketAddrs, B: ToI2pSocketAddrs, F, T>(sam_addr: A, addr: B, mut f: F) -> io::Result<T>
where
    F: FnMut(&SocketAddr, &I2pSocketAddr) -> io::Result<T>,
{
    let mut last_err = None;
    for addr in addr.to_socket_addrs()? {
        for sam_addr in sam_addr.to_socket_addrs()? {
            match f(&sam_addr, &addr) {
                Ok(l) => return Ok(l),
                Err(e) => last_err = Some(e),
            }
        }
    }
    Err(
        last_err.unwrap_or_else(
            || {
                io::Error::new(
                    io::ErrorKind::InvalidInput,
                    "could not resolve to any addresses",
                )
            },
        ),
    )
}