// GENERATED — DO NOT EDIT

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Application.html).
pub type Application

///|
pub(open) trait IApplication {
  fn as_application(Self) -> Application
}

///|
pub impl IApplication for Application with fn as_application(self) {
  self
}

///|
#borrow(application_id)
extern "c" fn moonbit_adw_application_new(
  application_id : @glib.Nullable[Bytes],
  flags : Int,
) -> Application = "moonbit_adw_application_new"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/ctor.Application.new.html).
pub fn Application::new(
  application_id : String?,
  flags : @gio.ApplicationFlags,
) -> Application {
  moonbit_adw_application_new(
    match application_id {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    flags.to_int(),
  )
}

///|
pub fn Application::as_gtk_application(self : Application) -> @gtk.Application = "%identity"

///|
pub impl @gtk.IApplication for Application with fn as_application(self) {
  self.as_gtk_application()
}

///|
pub fn Application::as_gio_application(self : Application) -> @gio.Application = "%identity"

///|
pub impl @gio.IApplication for Application with fn as_application(self) {
  self.as_gio_application()
}

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

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

///|
pub fn Application::as_gio_action_group(self : Application) -> @gio.ActionGroup = "%identity"

///|
pub impl @gio.IActionGroup for Application with fn as_action_group(self) {
  self.as_gio_action_group()
}