use std::net::SocketAddr;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Family {
V6,
V4,
}
impl Family {
pub fn of(addr: &SocketAddr) -> Family {
match addr {
SocketAddr::V6(a) if a.ip().to_ipv4_mapped().is_none() => Family::V6,
_ => Family::V4,
}
}
pub const PREFERENCE: [Family; 2] = [Family::V6, Family::V4];
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classifies_plain_v6_as_v6() {
let addr: SocketAddr = "[2001:db8::1]:443".parse().unwrap();
assert_eq!(Family::of(&addr), Family::V6);
}
#[test]
fn classifies_v4_as_v4() {
let addr: SocketAddr = "203.0.113.1:443".parse().unwrap();
assert_eq!(Family::of(&addr), Family::V4);
}
#[test]
fn classifies_v4_mapped_v6_as_v4() {
let addr: SocketAddr = "[::ffff:203.0.113.1]:443".parse().unwrap();
assert_eq!(Family::of(&addr), Family::V4);
}
#[test]
fn v6_sorts_before_v4() {
assert!(Family::V6 < Family::V4);
assert_eq!(Family::PREFERENCE, [Family::V6, Family::V4]);
}
}