mirror of
https://github.com/jht5945/rust_util.git
synced 2025-12-27 15:40:03 +08:00
feat: add ip address
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "rust_util"
|
||||
version = "0.6.5"
|
||||
version = "0.6.6"
|
||||
authors = ["Hatter Jiang <jht5945@gmail.com>"]
|
||||
edition = "2018"
|
||||
description = "Hatter's Rust Util"
|
||||
|
||||
@@ -1,6 +1,29 @@
|
||||
use std::net::SocketAddr;
|
||||
use crate::XResult;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum IpAddress {
|
||||
Ipv4([u8; 4]),
|
||||
}
|
||||
|
||||
impl IpAddress {
|
||||
pub fn parse_ipv4(addr: &str) -> Option<Self> {
|
||||
parse_ipv4_addr(addr).map(|parts| IpAddress::Ipv4(parts))
|
||||
}
|
||||
|
||||
pub fn to_address(&self) -> String {
|
||||
match self {
|
||||
IpAddress::Ipv4(ipv4) => ipv4.iter().map(|p| p.to_string()).collect::<Vec<_>>().join("."),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_matches(&self, socket_addr: &SocketAddr) -> bool {
|
||||
match self {
|
||||
IpAddress::Ipv4(self_ipv4_octets) => IpAddressMask::Ipv4(self_ipv4_octets.clone(), 32).is_matches(socket_addr),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum IpAddressMask {
|
||||
Ipv4([u8; 4], u8),
|
||||
@@ -20,21 +43,7 @@ impl IpAddressMask {
|
||||
} else {
|
||||
return None;
|
||||
};
|
||||
let addr_parts = addr_ip.split('.').collect::<Vec<_>>();
|
||||
if addr_parts.len() != 4 {
|
||||
return None;
|
||||
}
|
||||
let parsed_addr = || -> XResult<[u8; 4]> {
|
||||
Ok([addr_parts[0].parse::<u8>()?,
|
||||
addr_parts[1].parse::<u8>()?,
|
||||
addr_parts[2].parse::<u8>()?,
|
||||
addr_parts[3].parse::<u8>()?
|
||||
])
|
||||
};
|
||||
match parsed_addr() {
|
||||
Ok(parts) => Some(IpAddressMask::Ipv4(parts, mask)),
|
||||
Err(_) => None,
|
||||
}
|
||||
parse_ipv4_addr(addr_ip).map(|parts| IpAddressMask::Ipv4(parts, mask))
|
||||
}
|
||||
|
||||
pub fn to_address(&self) -> String {
|
||||
@@ -79,6 +88,20 @@ fn ipv4_to_u32(ipv4: &[u8; 4]) -> u32 {
|
||||
((ipv4[0] as u32) << (8 * 3)) + ((ipv4[1] as u32) << (8 * 2)) + ((ipv4[2] as u32) << 8) + (ipv4[3] as u32)
|
||||
}
|
||||
|
||||
fn parse_ipv4_addr(addr: &str) -> Option<[u8; 4]> {
|
||||
let addr_parts = addr.split('.').collect::<Vec<_>>();
|
||||
if addr_parts.len() != 4 {
|
||||
return None;
|
||||
}
|
||||
let parsed_addr = || -> XResult<[u8; 4]> {
|
||||
Ok([addr_parts[0].parse::<u8>()?,
|
||||
addr_parts[1].parse::<u8>()?,
|
||||
addr_parts[2].parse::<u8>()?,
|
||||
addr_parts[3].parse::<u8>()?
|
||||
])
|
||||
};
|
||||
parsed_addr().ok()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_matches() {
|
||||
|
||||
Reference in New Issue
Block a user