Challenge 25

IP Validation

Write a function is_valid_ip that will verfify valid IPv4 addresses in dot-decimal format. IPs should be considered valid if they consist of four octets, with values between 0 and 255, inclusive.

fn is_valid_ip(ip: &str) -> bool {
    // your implementation goes here
    // dont touch the code in the main function below
}

fn main() {
    // Test 1: Valid IP - Basic case
    let ip1 = "1.2.3.4";
    if !is_valid_ip(ip1) {
        panic!("Test 1 failed: '{}' should be valid", ip1);
    }
    println!("Test 1 passed: '{}' is valid", ip1);

    // Test 2: Valid IP - All numbers in range
    let ip2 = "123.45.67.89";
    if !is_valid_ip(ip2) {
        panic!("Test 2 failed: '{}' should be valid", ip2);
    }
    println!("Test 2 passed: '{}' is valid", ip2);

    // Test 3: Invalid IP - Too few octets
    let ip3 = "1.2.3";
    if is_valid_ip(ip3) {
        panic!("Test 3 failed: '{}' should be invalid (too few octets)", ip3);
    }
    println!("Test 3 passed: '{}' is invalid", ip3);

    // Test 4: Invalid IP - Too many octets
    let ip4 = "1.2.3.4.5";
    if is_valid_ip(ip4) {
        panic!("Test 4 failed: '{}' should be invalid (too many octets)", ip4);
    }
    println!("Test 4 passed: '{}' is invalid", ip4);

    // Test 5: Invalid IP - Out of range (456 > 255)
    let ip5 = "123.456.78.90";
    if is_valid_ip(ip5) {
        panic!("Test 5 failed: '{}' should be invalid (octet out of range)", ip5);
    }
    println!("Test 5 passed: '{}' is invalid", ip5);

    // Test 6: Invalid IP - Leading zeros
    let ip6 = "123.045.067.089";
    if is_valid_ip(ip6) {
        panic!("Test 6 failed: '{}' should be invalid (leading zeros)", ip6);
    }
    println!("Test 6 passed: '{}' is invalid", ip6);

    // Test 7: Invalid IP - Non-numeric octet
    let ip7 = "123.45.67.8a";
    if is_valid_ip(ip7) {
        panic!("Test 7 failed: '{}' should be invalid (non-numeric octet)", ip7);
    }
    println!("Test 7 passed: '{}' is invalid", ip7);

    // Test 8: Invalid IP - Empty octet
    let ip8 = "123.45..89";
    if is_valid_ip(ip8) {
        panic!("Test 8 failed: '{}' should be invalid (empty octet)", ip8);
    }
    println!("Test 8 passed: '{}' is invalid", ip8);

    // Test 9: Edge case - All zeros
    let ip9 = "0.0.0.0";
    if !is_valid_ip(ip9) {
        panic!("Test 9 failed: '{}' should be valid", ip9);
    }
    println!("Test 9 passed: '{}' is valid", ip9);

    // Test 10: Edge case - Maximum values
    let ip10 = "255.255.255.255";
    if !is_valid_ip(ip10) {
        panic!("Test 10 failed: '{}' should be valid", ip10);
    }
    println!("Test 10 passed: '{}' is valid", ip10);
}

Solution

Click to Show/Hide Solution
#![allow(unused)]
fn main() {
fn is_valid_ip(ip: &str) -> bool {
    let octets: Vec<&str> = ip.split('.').collect();
    if octets.len() != 4 {
        return false;
    }
    for octet in octets {
        if octet.is_empty() {
            return false;
        }
        if octet.len() > 1 && octet.starts_with('0') {
            return false;
        }
        match octet.parse::<u8>() {
            Ok(_) => (),
            Err(_) => return false,
        }
    }
    true
}
}

or

#![allow(unused)]

fn main() {
use std::net::IpAddr;

fn is_valid_ipv4(ip: &str) -> bool {
    match ip.parse::<IpAddr>() {
        Ok(IpAddr::V4(_)) => true,
        _ => false,
    }
}
}