Skip to main content

enet/
address.rs

1use {std, ll};
2#[cfg(feature = "serde")]
3use serde;
4
5#[derive(Clone)]
6pub struct Address {
7  address : ll::ENetAddress
8}
9
10//
11//  AddressError
12//
13
14#[derive(Debug)]
15pub enum AddressError {
16  HostNameResolveFailure (String),
17  CStringNulError        (std::ffi::NulError)
18}
19
20////////////////////////////////////////////////////////////////////////////////
21//  impls                                                                     //
22////////////////////////////////////////////////////////////////////////////////
23
24impl Address {
25  pub(crate) const fn from_ll (address : ll::ENetAddress) -> Self {
26    Address { address }
27  }
28  /// 127.0.0.1
29  #[inline]
30  pub fn localhost (port : u16) -> Address {
31    Address::with_hostname ("127.0.0.1", port).unwrap()
32  }
33  /// Creates an address with `ENET_HOST_ANY` (0.0.0.0)
34  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  /// # Safety
53  ///
54  /// Unsafe: returns a raw pointer.
55  #[inline]
56  pub const unsafe fn raw (&self) -> *const ll::ENetAddress {
57    &self.address
58  }
59  /// # Safety
60  ///
61  /// Unsafe: returns a raw pointer.
62  #[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} // end impl Address
79impl Default for Address {
80  /// 127.0.0.1:80
81  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}