systemproxy 0.3.8

A library for set/get system proxy. Supports Windows, macOS and linux (via gsettings).
Documentation
#[cfg(feature = "iptools")]
use iptools::iprange::{IPv4, IpRange, IpVer};

/// Convert ipv4 cidr to wildcard
///
/// Example:
/// ```
/// use systemproxy::utils::ipv4_cidr_to_wildcard;
/// assert_eq!(ipv4_cidr_to_wildcard("127.0.0.1/8").unwrap(), vec!["127.*".to_string()]);
/// ```
#[cfg(feature = "iptools")]
pub fn ipv4_cidr_to_wildcard(cidr: &str) -> crate::Result<Vec<String>> {
    let ip = IpRange::<IPv4>::new(cidr, "").or(Err(crate::Error::ParseStr(cidr.into())))?;

    if ip.get_version() != IpVer::V4 {
        return Err(crate::Error::ParseStr(cidr.into()));
    }

    let (start, end) = ip.get_range();
    let start = start.split('.').collect::<Vec<&str>>();
    let end = end.split('.').collect::<Vec<&str>>();

    let mut ret = vec![];
    let mut each = String::new();
    for i in 0..4 {
        if start[i] == end[i] {
            each.push_str(start[i]);
            if i != 3 {
                each.push('.');
            }
            continue;
        }

        if start[i] == "0" && end[i] == "255" {
            each.push('*');
            ret.push(each);
            break;
        }

        let s = start[i]
            .parse::<u16>()
            .or(Err(crate::Error::ParseStr(cidr.into())))?;
        let e = end[i]
            .parse::<u16>()
            .or(Err(crate::Error::ParseStr(cidr.into())))?;

        for j in s..e + 1 {
            let mut builder = each.clone();
            builder.push_str(&j.to_string());
            if i != 3 {
                builder.push_str(".*");
            }
            ret.push(builder);
        }
        break;
    }
    Ok(ret)
}

#[test]
#[cfg(feature = "iptools")]
fn test_ipv4_cidr_to_wildcard() {
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/1"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/2"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/3"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/4"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/5"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/6"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/7"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/8"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/9"));
    println!("{:?}", ipv4_cidr_to_wildcard("127.0.0.1/10"));
}