ipzone 0.4.0

Ipzone provides a simple and powerful IP architecture to Rust.
Documentation
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};

use ipzone::prelude::*;

fn main() {
    std::env::set_var("PORT", "8080");

    let localhost = ip::localhost().with([
        //
        1234,
        port::from_env("PORT").unwrap(),
        port::from_env("PORT2").unwrap_or(5050),
    ]);
    assert_eq!(
        localhost.to_socket_addrs().unwrap().collect::<Vec<_>>(),
        vec![
            SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 1234),
            SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080),
            SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 5050),
        ]
    );

    let ip = ip::from([186, 23, 123, 1]).with([
        //
        80,
        port::from_str("123").unwrap(),
        port::from_env("PORT").unwrap(),
    ]);
    assert_eq!(
        ip.to_socket_addrs().unwrap().collect::<Vec<_>>(),
        vec![
            SocketAddr::new(Ipv4Addr::new(186, 23, 123, 1).into(), 80),
            SocketAddr::new(Ipv4Addr::new(186, 23, 123, 1).into(), 123),
            SocketAddr::new(Ipv4Addr::new(186, 23, 123, 1).into(), 8080),
        ]
    );

    let ip2 = ip::from_str("::ffff:aabb:ccdd").unwrap().with([80, 443]);
    assert_eq!(
        ip2.to_socket_addrs().unwrap().collect::<Vec<_>>(),
        vec![
            SocketAddr::new(
                Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xaabb, 0xccdd).into(),
                80
            ),
            SocketAddr::new(
                Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xaabb, 0xccdd).into(),
                443
            ),
        ]
    );

    std::env::set_var("IP", "168.32.12.1");
    let ip3 = ip::from_env("IP").unwrap().with([80, 443]);
    assert_eq!(
        ip3.to_socket_addrs().unwrap().collect::<Vec<_>>(),
        vec![
            SocketAddr::new(Ipv4Addr::new(168, 32, 12, 1).into(), 80),
            SocketAddr::new(Ipv4Addr::new(168, 32, 12, 1).into(), 443),
        ]
    );
}