use std::{str::FromStr}; use ip::IpAddr; pub mod ip; #[allow(unused)] pub struct Network { network_address: IpAddr, broadcast_addr: IpAddr, subnet_mask: Option } impl Network { // pub fn generate_subnets(self) -> Vec {} // fn get_net_id(self) -> u8 {} } /// Function that takes in a string reference and returns the result of splitting a string into /// both its Address and CIDR /// /// ``` /// let ip_string = String::from("192.168.0.1/24"); /// let result = match ip_and_cidr_from_string(&ip_string) { /// Err(_) => panic!(), /// Ok(ip_and_cidr) => ip_and_cidr /// }; /// /// >> (IpAddr::V4(192, 168, 0, 1), 24) /// ``` pub fn ip_and_cidr_from_string(ip_and_cidr: &String) -> Result<(IpAddr, u8), ip::InvalidIPErr>{ let mut cidr: u8 = Default::default(); let mut ip: String = Default::default(); if ip_and_cidr.contains("/") { let split_ip_cidr = ip_and_cidr.split("/"); if split_ip_cidr.clone().count() > 2 { return Err(ip::InvalidIPErr); } ip = split_ip_cidr.clone().into_iter().next().unwrap_or("0.0.0.0").to_owned(); cidr = match split_ip_cidr.into_iter().last() { None => return Err(ip::InvalidIPErr), Some(cidr) => match cidr.trim().parse::() { Err(_) => return Err(ip::InvalidIPErr), Ok(cidr) => cidr } }; println!("CIDR: {:?}", cidr); } let ip_address: IpAddr = match IpAddr::from_str(&ip.trim()) { Err(_) => return Err(ip::InvalidIPErr), Ok(ip) => ip, }; return Ok((ip_address, cidr)) } mod tests { #[cfg(test)] #[test] fn string_to_ip_cidr_test() { use super::*; let ip_string = String::from("127.0.0.1/8"); let result = match ip_and_cidr_from_string(&ip_string) { Err(_) => panic!(), Ok(ip_and_cidr) => ip_and_cidr }; assert_eq!(result.0, IpAddr::V4(127, 0, 0, 1)); assert_eq!(result.1, 8); } }