1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
pub use no_std_net::{ IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, }; use heapless::{ String, consts::U256, }; use core::str::FromStr; #[derive(Debug)] pub struct HostAddr { ip: IpAddr, hostname: Option<String<U256>>, } impl HostAddr { pub fn new(ip: IpAddr, hostname: Option<String<U256>>) -> Self { HostAddr { ip, hostname, } } pub fn ipv4(octets: [u8;4]) -> HostAddr { HostAddr { ip: IpAddr::from(octets), hostname: None } } pub fn ipv6(octets: [u8;16]) -> HostAddr { HostAddr { ip: IpAddr::from(octets), hostname: None } } pub fn ip(&self) -> IpAddr { self.ip } pub fn hostname(&self) -> Option<&String<U256>> { self.hostname.as_ref() } } #[derive(Debug)] pub struct AddrParseError; impl FromStr for HostAddr { type Err = AddrParseError; fn from_str(s: &str) -> Result<Self, Self::Err> { Ok(HostAddr::new( IpAddr::from_str(s).map_err(|_| AddrParseError)?, Some(String::from_str(s).unwrap()), )) } } impl From<IpAddr> for HostAddr { fn from(ip: IpAddr) -> Self { HostAddr { ip, hostname: None, } } } #[derive(Debug)] pub struct HostSocketAddr { addr: HostAddr, port: u16, } impl HostSocketAddr { pub fn new(addr: HostAddr, port: u16) -> HostSocketAddr { HostSocketAddr { addr, port, } } pub fn from(addr: &str, port: u16) -> Result<HostSocketAddr, AddrParseError> { Ok( Self::new( HostAddr::from_str(addr)?, port ) ) } pub fn addr(&self) -> &HostAddr { &self.addr } pub fn port(&self) -> u16 { self.port } pub fn as_socket_addr(&self) -> SocketAddr { SocketAddr::new(self.addr.ip, self.port) } }