Skip to content

Commit e0a9afc

Browse files
authored
Merge pull request #79 from sharksforarms/issue-#62
Parse Ipv4Addr using Ipv4Addr::from_str
2 parents d5e6b11 + 5e7eb0b commit e0a9afc

File tree

3 files changed

+5
-60
lines changed

3 files changed

+5
-60
lines changed

src/common.rs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,3 @@ pub fn parse_prefix(prefix: &str, max: u8) -> Result<u8, IpNetworkError> {
5656
Ok(mask)
5757
}
5858
}
59-
60-
pub fn parse_addr(addr: &str) -> Result<Ipv4Addr, IpNetworkError> {
61-
let addr_parts = addr.split('.').map(|b| b.parse::<u8>());
62-
let mut bytes = [0; 4];
63-
for (i, byte) in addr_parts.enumerate() {
64-
if i >= 4 {
65-
return Err(IpNetworkError::InvalidAddr(format!(
66-
"More than 4 bytes: {}",
67-
addr
68-
)));
69-
}
70-
bytes[i] = byte.map_err(|_| {
71-
IpNetworkError::InvalidAddr(format!("All bytes not 0-255: {}", addr))
72-
})?;
73-
}
74-
Ok(Ipv4Addr::new(bytes[0], bytes[1], bytes[2], bytes[3]))
75-
}

src/ipv4.rs

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::str::FromStr;
44

55
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
66

7-
use common::{cidr_parts, parse_addr, parse_prefix, IpNetworkError};
7+
use common::{cidr_parts, parse_prefix, IpNetworkError};
88

99
const IPV4_BITS: u8 = 32;
1010

@@ -205,7 +205,8 @@ impl FromStr for Ipv4Network {
205205
type Err = IpNetworkError;
206206
fn from_str(s: &str) -> Result<Ipv4Network, IpNetworkError> {
207207
let (addr_str, prefix_str) = cidr_parts(s)?;
208-
let addr = parse_addr(addr_str)?;
208+
let addr = Ipv4Addr::from_str(addr_str)
209+
.map_err(|_| IpNetworkError::InvalidAddr(addr_str.to_string()))?;
209210
let prefix = match prefix_str {
210211
Some(v) => parse_prefix(v, IPV4_BITS)?,
211212
None => IPV4_BITS,
@@ -274,13 +275,6 @@ mod test {
274275
assert!(net.is_err());
275276
}
276277

277-
#[test]
278-
fn parse_v4_0bit() {
279-
let cidr: Ipv4Network = "0/0".parse().unwrap();
280-
assert_eq!(cidr.ip(), Ipv4Addr::new(0, 0, 0, 0));
281-
assert_eq!(cidr.prefix(), 0);
282-
}
283-
284278
#[test]
285279
fn parse_v4_24bit() {
286280
let cidr: Ipv4Network = "127.1.0.0/24".parse().unwrap();
@@ -339,30 +333,6 @@ mod test {
339333
assert_eq!(None, cidr);
340334
}
341335

342-
#[test]
343-
fn size_v4_24bit() {
344-
let net: Ipv4Network = "0/24".parse().unwrap();
345-
assert_eq!(net.size(), 256);
346-
}
347-
348-
#[test]
349-
fn size_v4_1bit() {
350-
let net: Ipv4Network = "0/31".parse().unwrap();
351-
assert_eq!(net.size(), 2);
352-
}
353-
354-
#[test]
355-
fn size_v4_max() {
356-
let net: Ipv4Network = "0/0".parse().unwrap();
357-
assert_eq!(net.size(), 4_294_967_296);
358-
}
359-
360-
#[test]
361-
fn size_v4_min() {
362-
let net: Ipv4Network = "0/32".parse().unwrap();
363-
assert_eq!(net.size(), 1);
364-
}
365-
366336
#[test]
367337
fn nth_v4() {
368338
let net = Ipv4Network::new(Ipv4Addr::new(127, 0, 0, 0), 24).unwrap();
@@ -439,14 +409,6 @@ mod test {
439409
assert_eq!(None, iter.next());
440410
}
441411

442-
#[test]
443-
fn iterator_v4_tiny() {
444-
let cidr: Ipv4Network = "10/32".parse().unwrap();
445-
let mut iter = cidr.iter();
446-
assert_eq!(Ipv4Addr::new(10, 0, 0, 0), iter.next().unwrap());
447-
assert_eq!(None, iter.next());
448-
}
449-
450412
// Tests the entire IPv4 space to see if the iterator will stop at the correct place
451413
// and not overflow or wrap around. Ignored since it takes a long time to run.
452414
#[test]

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ mod ipv6;
2020
use std::str::FromStr;
2121

2222
pub use common::IpNetworkError;
23-
pub use ipv4::{ipv4_mask_to_prefix, Ipv4Network};
24-
pub use ipv6::{ipv6_mask_to_prefix, Ipv6Network};
23+
pub use ipv4::{Ipv4Network, ipv4_mask_to_prefix};
24+
pub use ipv6::{Ipv6Network, ipv6_mask_to_prefix};
2525

2626
/// Represents a generic network range. This type can have two variants:
2727
/// the v4 and the v6 case.

0 commit comments

Comments
 (0)