1use {std, ll};
2#[cfg(feature = "serde")]
3use serde;
4
5#[derive(Clone)]
6pub struct Address {
7 address : ll::ENetAddress
8}
9
10#[derive(Debug)]
15pub enum AddressError {
16 HostNameResolveFailure (String),
17 CStringNulError (std::ffi::NulError)
18}
19
20impl Address {
25 pub(crate) const fn from_ll (address : ll::ENetAddress) -> Self {
26 Address { address }
27 }
28 #[inline]
30 pub fn localhost (port : u16) -> Address {
31 Address::with_hostname ("127.0.0.1", port).unwrap()
32 }
33 pub const fn any (port : u16) -> Address {
35 let host = ll::ENET_HOST_ANY;
36 let address = ll::ENetAddress { host, port };
37 Address { address }
38 }
39 pub fn with_hostname (hostname : &str, port : u16) -> Result<Address, AddressError> {
40 let cname = std::ffi::CString::new(hostname)?;
41 unsafe {
42 let address = {
43 let mut address = ll::ENetAddress { host: 0, port: 0 };
44 if ll::enet_address_set_host(&mut address, cname.as_ptr()) < 0 {
45 return Err(AddressError::HostNameResolveFailure(hostname.to_string()))
46 }
47 ll::ENetAddress { port, .. address }
48 };
49 Ok(Address { address })
50 }
51 }
52 #[inline]
56 pub const unsafe fn raw (&self) -> *const ll::ENetAddress {
57 &self.address
58 }
59 #[inline]
63 pub const unsafe fn raw_mut (&mut self) -> *mut ll::ENetAddress {
64 &mut self.address
65 }
66 #[inline]
67 pub const fn host (self) -> u32 {
68 self.address.host
69 }
70 #[inline]
71 pub const fn host_bytes (self) -> [u8; 4] {
72 self.address.host.to_le_bytes()
73 }
74 #[inline]
75 pub const fn port (self) -> u16 {
76 self.address.port
77 }
78} impl Default for Address {
80 fn default() -> Self {
82 Address::localhost (80)
83 }
84}
85impl std::fmt::Debug for Address {
86 fn fmt (&self, f : &mut std::fmt::Formatter) -> std::fmt::Result {
87 let host = self.address.host.to_le_bytes();
88 let port = self.address.port;
89 write!(f, "Address {{ host: {}.{}.{}.{}, port: {} }}",
90 host[0], host[1], host[2], host[3], port)
91 }
92}
93#[cfg(feature = "serde")]
94impl serde::Serialize for Address {
95 fn serialize <S> (&self, serializer : S) -> Result <S::Ok, S::Error> where
96 S : serde::Serializer
97 {
98 #[derive(serde::Serialize)]
99 struct AddressRepr {
100 host : String,
101 port : u16
102 }
103 let repr = {
104 let host = self.address.host.to_le_bytes();
105 AddressRepr {
106 host: format!("{}.{}.{}.{}", host[0], host[1], host[2], host[3]),
107 port: self.address.port
108 }
109 };
110 repr.serialize (serializer)
111 }
112}
113
114impl From <std::ffi::NulError> for AddressError {
115 fn from (err : std::ffi::NulError) -> AddressError {
116 AddressError::CStringNulError (err)
117 }
118}