use core::net::SocketAddr;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[non_exhaustive]
pub enum TransportProtocol {
Udp,
Tcp,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct NetEndpoint {
pub addr: SocketAddr,
pub protocol: TransportProtocol,
}
impl NetEndpoint {
#[must_use]
pub const fn new(addr: SocketAddr, protocol: TransportProtocol) -> Self {
Self { addr, protocol }
}
#[must_use]
pub const fn udp(addr: SocketAddr) -> Self {
Self::new(addr, TransportProtocol::Udp)
}
#[must_use]
pub const fn tcp(addr: SocketAddr) -> Self {
Self::new(addr, TransportProtocol::Tcp)
}
}
#[cfg(test)]
mod tests {
use super::*;
use core::net::{Ipv4Addr, SocketAddrV4};
#[test]
fn constructors_set_protocol() {
let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 30490));
assert_eq!(NetEndpoint::udp(addr).protocol, TransportProtocol::Udp);
assert_eq!(NetEndpoint::tcp(addr).protocol, TransportProtocol::Tcp);
assert_eq!(NetEndpoint::udp(addr).addr, addr);
}
#[test]
fn endpoints_differing_only_in_protocol_are_distinct() {
let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 30490));
assert_ne!(NetEndpoint::udp(addr), NetEndpoint::tcp(addr));
}
}