// GENERATED — DO NOT EDIT

///|
/// [Upstream documentation](https://docs.gtk.org/gio/class.NetworkAddress.html).
pub type NetworkAddress

///|
pub(open) trait INetworkAddress {
  fn as_network_address(Self) -> NetworkAddress
  fn get_hostname(Self) -> String = _
  fn get_port(Self) -> UInt = _
  fn get_scheme(Self) -> String? = _
}

///|
pub impl INetworkAddress for NetworkAddress with fn as_network_address(self) {
  self
}

///|
#borrow(hostname)
extern "c" fn moonbit_g_network_address_new(
  hostname : Bytes,
  port : UInt,
) -> NetworkAddress = "moonbit_g_network_address_new"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.NetworkAddress.new.html).
pub fn NetworkAddress::new(hostname : String, port : UInt) -> NetworkAddress {
  moonbit_g_network_address_new(@encoding/utf8.encode(hostname), port)
}

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.NetworkAddress.new_loopback.html).
pub extern "c" fn NetworkAddress::new_loopback(port : UInt) -> NetworkAddress = "moonbit_g_network_address_new_loopback"

///|
#borrow(host_and_port, error)
extern "c" fn moonbit_g_network_address_parse(
  host_and_port : Bytes,
  default_port : UInt,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> NetworkAddress = "moonbit_g_network_address_parse"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/type_func.NetworkAddress.parse.html).
pub fn NetworkAddress::parse(
  host_and_port : String,
  default_port : UInt,
) -> NetworkAddress raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_network_address_parse(
    @encoding/utf8.encode(host_and_port),
    default_port,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(uri, error)
extern "c" fn moonbit_g_network_address_parse_uri(
  uri : Bytes,
  default_port : UInt,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> NetworkAddress = "moonbit_g_network_address_parse_uri"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/type_func.NetworkAddress.parse_uri.html).
pub fn NetworkAddress::parse_uri(
  uri : String,
  default_port : UInt,
) -> NetworkAddress raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_network_address_parse_uri(
    @encoding/utf8.encode(uri),
    default_port,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(self_)
extern "c" fn moonbit_g_network_address_get_hostname(
  self_ : NetworkAddress,
) -> Bytes = "moonbit_g_network_address_get_hostname"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.NetworkAddress.get_hostname.html).
pub fn NetworkAddress::get_hostname(self : NetworkAddress) -> String {
  @encoding/utf8.decode_lossy(moonbit_g_network_address_get_hostname(self))
}

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.NetworkAddress.get_port.html).
#borrow(self)
pub extern "c" fn NetworkAddress::get_port(self : NetworkAddress) -> UInt = "moonbit_g_network_address_get_port"

///|
#borrow(self_)
extern "c" fn moonbit_g_network_address_get_scheme(
  self_ : NetworkAddress,
) -> @glib.Nullable[Bytes] = "moonbit_g_network_address_get_scheme"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.NetworkAddress.get_scheme.html).
pub fn NetworkAddress::get_scheme(self : NetworkAddress) -> String? {
  let result = moonbit_g_network_address_get_scheme(self)
  match result.to_option() {
    Some(bytes) => Some(@encoding/utf8.decode_lossy(bytes))
    None => None
  }
}

///|
impl INetworkAddress with fn get_hostname(self) -> String {
  self.as_network_address().get_hostname()
}

///|
impl INetworkAddress with fn get_port(self) -> UInt {
  self.as_network_address().get_port()
}

///|
impl INetworkAddress with fn get_scheme(self) -> String? {
  self.as_network_address().get_scheme()
}

///|
pub fn NetworkAddress::as_gobject_object(
  self : NetworkAddress,
) -> @gobject.Object = "%identity"

///|
pub impl @gobject.IObject for NetworkAddress with fn as_object(self) {
  self.as_gobject_object()
}

///|
pub fn NetworkAddress::as_socket_connectable(
  self : NetworkAddress,
) -> SocketConnectable = "%identity"

///|
pub impl ISocketConnectable for NetworkAddress with fn as_socket_connectable(
  self,
) {
  self.as_socket_connectable()
}