orphanage 0.5.6

Random collection of stuff that is still searching for a home.
Documentation
use std::net::SocketAddr;

/// Generate a host name from a socket address.
///
/// TLS clients tend to need a host name when connecting to a server.  This
/// function can be used to derive a default host name from a socket address
/// when no explicit host name has been specified.
///
/// ```
/// use orphanage::netx::host_from_sockaddr;
///
/// let host: Option<&str> = None;  // No explicit host name
///
/// // IP address
/// let sockaddr = "127.0.0.1:8000";
/// let hn = host.map_or_else(
///   || host_from_sockaddr(sockaddr),
///   ToString::to_string
/// );
/// assert_eq!(hn, "127.0.0.1");
///
/// // hostname
/// let sockaddr = "example.org:8000";
/// let hn = host.map_or_else(
///   || host_from_sockaddr(sockaddr),
///   ToString::to_string
/// );
/// assert_eq!(hn, "example.org");
/// ```
#[must_use]
pub fn host_from_sockaddr(sockaddr: &str) -> String {
  sockaddr.parse::<SocketAddr>().map_or_else(
    |_| {
      if let Some((host, _)) = sockaddr.split_once(':') {
        host.to_string()
      } else {
        sockaddr.to_string()
      }
    },
    |sa| {
      let ipaddr = sa.ip();
      format!("{ipaddr}")
    }
  )
}

#[cfg(test)]
mod tests {
  use super::host_from_sockaddr;

  #[test]
  fn simple() {
    assert_eq!(host_from_sockaddr("foo:1234"), String::from("foo"));
    assert_eq!(
      host_from_sockaddr("127.0.0.1:1234"),
      String::from("127.0.0.1")
    );
  }
}

// vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :