// GENERATED — DO NOT EDIT

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

///|
pub(open) trait ISocketListener {
  fn as_socket_listener(Self) -> SocketListener
  fn add_any_inet_port(Self, &@gobject.IObject?) -> UInt raise @glib.Error_ = _
  fn add_inet_port(Self, UInt, &@gobject.IObject?) -> Bool raise @glib.Error_ = _
  fn add_socket(Self, &ISocket, &@gobject.IObject?) -> Bool raise @glib.Error_ = _
  fn close(Self) -> Unit = _
  fn set_backlog(Self, Int) -> Unit = _
  fn connect_event(Self, (SocketListener, SocketListenerEvent, Socket) -> Unit) -> UInt64 = _
}

///|
pub impl ISocketListener for SocketListener with fn as_socket_listener(self) {
  self
}

///|
/// Implementation contract for SocketListener.changed. Self is the retained MoonBit state; the second parameter is the invoked SocketListener object.
pub(open) trait VSocketListenerChanged {
  fn changed(Self, SocketListener) -> Unit
}

///|
/// Implementation contract for SocketListener.event. Self is the retained MoonBit state; the second parameter is the invoked SocketListener object.
pub(open) trait VSocketListenerEvent {
  fn event(Self, SocketListener, SocketListenerEvent, &ISocket) -> Unit
}

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.SocketListener.new.html).
pub extern "c" fn SocketListener::new() -> SocketListener = "moonbit_g_socket_listener_new"

///|
#borrow(self_, source_object, error)
extern "c" fn moonbit_g_socket_listener_add_any_inet_port(
  self_ : SocketListener,
  source_object : @glib.Nullable[@gobject.Object],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> UInt = "moonbit_g_socket_listener_add_any_inet_port"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.SocketListener.add_any_inet_port.html).
pub fn SocketListener::add_any_inet_port(
  self : SocketListener,
  source_object : &@gobject.IObject?,
) -> UInt raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_socket_listener_add_any_inet_port(
    self,
    match source_object {
      Some(v) => @glib.Nullable::some(v.as_object())
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
#borrow(self_, source_object, error)
extern "c" fn moonbit_g_socket_listener_add_inet_port(
  self_ : SocketListener,
  port : UInt,
  source_object : @glib.Nullable[@gobject.Object],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Bool = "moonbit_g_socket_listener_add_inet_port"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.SocketListener.add_inet_port.html).
pub fn SocketListener::add_inet_port(
  self : SocketListener,
  port : UInt,
  source_object : &@gobject.IObject?,
) -> Bool raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_socket_listener_add_inet_port(
    self,
    port,
    match source_object {
      Some(v) => @glib.Nullable::some(v.as_object())
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
#borrow(self_, socket, source_object, error)
extern "c" fn moonbit_g_socket_listener_add_socket(
  self_ : SocketListener,
  socket : Socket,
  source_object : @glib.Nullable[@gobject.Object],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Bool = "moonbit_g_socket_listener_add_socket"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.SocketListener.add_socket.html).
pub fn SocketListener::add_socket(
  self : SocketListener,
  socket : &ISocket,
  source_object : &@gobject.IObject?,
) -> Bool raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_socket_listener_add_socket(
    self,
    socket.as_socket(),
    match source_object {
      Some(v) => @glib.Nullable::some(v.as_object())
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.SocketListener.close.html).
#borrow(self)
pub extern "c" fn SocketListener::close(self : SocketListener) = "moonbit_g_socket_listener_close"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.SocketListener.set_backlog.html).
#borrow(self)
pub extern "c" fn SocketListener::set_backlog(
  self : SocketListener,
  listen_backlog : Int,
) = "moonbit_g_socket_listener_set_backlog"

///|
#borrow(instance)
extern "c" fn g_socket_listener_connect_event(
  instance : SocketListener,
  function : FuncRef[
    (
      SocketListener,
      SocketListenerEvent,
      Socket,
      (SocketListener, SocketListenerEvent, Socket) -> Unit,
    ) -> Unit,
  ],
  closure : (SocketListener, SocketListenerEvent, Socket) -> Unit,
) -> UInt64 = "moonbit_g_socket_listener_connect_event"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.SocketListener.event.html).
pub fn SocketListener::connect_event(
  self : SocketListener,
  f : (SocketListener, SocketListenerEvent, Socket) -> Unit,
) -> UInt64 {
  g_socket_listener_connect_event(
    self,
    fn(instance_, event, socket, f) { f(instance_, event, socket) },
    f,
  )
}

///|
/// [Upstream documentation](https://docs.gtk.org/gio/property.SocketListener.listen-backlog.html).
#borrow(self_)
pub extern "c" fn SocketListener::get_listen_backlog(
  self_ : SocketListener,
) -> Int = "moonbit_g_socket_listener_get_listen_backlog"

///|
#borrow(self_, value)
pub extern "c" fn SocketListener::set_listen_backlog(
  self_ : SocketListener,
  value : Int,
) = "moonbit_g_socket_listener_set_listen_backlog"

///|
impl ISocketListener with fn add_any_inet_port(self, source_object) -> UInt raise @glib.Error_ {
  self.as_socket_listener().add_any_inet_port(source_object)
}

///|
impl ISocketListener with fn add_inet_port(self, port, source_object) -> Bool raise @glib.Error_ {
  self.as_socket_listener().add_inet_port(port, source_object)
}

///|
impl ISocketListener with fn add_socket(self, socket, source_object) -> Bool raise @glib.Error_ {
  self.as_socket_listener().add_socket(socket, source_object)
}

///|
impl ISocketListener with fn close(self) -> Unit {
  self.as_socket_listener().close()
}

///|
impl ISocketListener with fn set_backlog(self, listen_backlog) -> Unit {
  self.as_socket_listener().set_backlog(listen_backlog)
}

///|
impl ISocketListener with fn connect_event(self, f) -> UInt64 {
  self.as_socket_listener().connect_event(f)
}

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

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