// GENERATED — DO NOT EDIT

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

///|
pub(open) trait ISocketService {
  fn as_socket_service(Self) -> SocketService
  fn is_active(Self) -> Bool = _
  fn start(Self) -> Unit = _
  fn stop(Self) -> Unit = _
  fn connect_incoming(
    Self,
    (SocketService, SocketConnection, @gobject.Object?) -> Bool,
  ) -> UInt64 = _
}

///|
pub impl ISocketService for SocketService with fn as_socket_service(self) {
  self
}

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

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.SocketService.is_active.html).
#borrow(self)
pub extern "c" fn SocketService::is_active(self : SocketService) -> Bool = "moonbit_g_socket_service_is_active"

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

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

///|
#borrow(instance)
extern "c" fn g_socket_service_connect_incoming(
  instance : SocketService,
  function : FuncRef[
    (
      SocketService,
      SocketConnection,
      @gobject.Object?,
      (SocketService, SocketConnection, @gobject.Object?) -> Bool,
    ) -> Bool,
  ],
  closure : (SocketService, SocketConnection, @gobject.Object?) -> Bool,
) -> UInt64 = "moonbit_g_socket_service_connect_incoming"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.SocketService.incoming.html).
pub fn SocketService::connect_incoming(
  self : SocketService,
  f : (SocketService, SocketConnection, @gobject.Object?) -> Bool,
) -> UInt64 {
  g_socket_service_connect_incoming(
    self,
    fn(instance_, connection, source_object, f) {
      f(instance_, connection, source_object)
    },
    f,
  )
}

///|
#borrow(self_)
extern "c" fn moonbit_g_socket_service_set_active(
  self_ : SocketService,
  value : Int,
) = "moonbit_g_socket_service_set_active"

///|
pub fn SocketService::set_active(self : SocketService, value : Bool) -> Unit {
  moonbit_g_socket_service_set_active(self, if value { 1 } else { 0 })
}

///|
impl ISocketService with fn is_active(self) -> Bool {
  self.as_socket_service().is_active()
}

///|
impl ISocketService with fn start(self) -> Unit {
  self.as_socket_service().start()
}

///|
impl ISocketService with fn stop(self) -> Unit {
  self.as_socket_service().stop()
}

///|
impl ISocketService with fn connect_incoming(self, f) -> UInt64 {
  self.as_socket_service().connect_incoming(f)
}

///|
pub fn SocketService::as_socket_listener(
  self : SocketService,
) -> SocketListener = "%identity"

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

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

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