ipv6: rewrite core ipv6 methods to operate on u128s (#187)

* errors: adds `From<AddrParseError>` for `IpNetworkError`

* ipv4: adds safety comment to `new_unchecked` and debug assertions to verify compliance

* ipv6: rewrite core ipv6 methods to operate on `u128`s
This commit is contained in:
Christopher Mahoney
2024-04-30 22:41:17 -04:00
committed by GitHub
parent 068959e2c4
commit 70d1f74e29
3 changed files with 117 additions and 81 deletions

View File

@ -1,4 +1,4 @@
use std::{error::Error, fmt};
use std::{error::Error, fmt, net::AddrParseError};
use crate::error::IpNetworkError::*;
@ -9,7 +9,7 @@ pub enum IpNetworkError {
InvalidAddr(String),
InvalidPrefix,
InvalidCidrFormat(String),
NetworkSizeError(NetworkSizeError)
NetworkSizeError(NetworkSizeError),
}
impl fmt::Display for IpNetworkError {
@ -18,7 +18,7 @@ impl fmt::Display for IpNetworkError {
InvalidAddr(ref s) => write!(f, "invalid address: {s}"),
InvalidPrefix => write!(f, "invalid prefix"),
InvalidCidrFormat(ref s) => write!(f, "invalid cidr format: {s}"),
NetworkSizeError(ref e) => write!(f, "network size error: {e}")
NetworkSizeError(ref e) => write!(f, "network size error: {e}"),
}
}
}
@ -29,16 +29,22 @@ impl Error for IpNetworkError {
InvalidAddr(_) => "address is invalid",
InvalidPrefix => "prefix is invalid",
InvalidCidrFormat(_) => "cidr is invalid",
NetworkSizeError(_) => "network size error"
NetworkSizeError(_) => "network size error",
}
}
}
impl From<AddrParseError> for IpNetworkError {
fn from(e: AddrParseError) -> Self {
InvalidAddr(e.to_string())
}
}
/// Cannot convert an IPv6 network size to a u32 as it is a 128-bit value.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum NetworkSizeError {
NetworkIsTooLarge
NetworkIsTooLarge,
}
impl fmt::Display for NetworkSizeError {