// GENERATED — DO NOT EDIT

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

///|
pub(open) trait IVolumeMonitor {
  fn as_volume_monitor(Self) -> VolumeMonitor
  fn get_connected_drives(Self) -> Array[Drive] = _
  fn get_mount_for_uuid(Self, String) -> Mount? = _
  fn get_mounts(Self) -> Array[Mount] = _
  fn get_volume_for_uuid(Self, String) -> Volume? = _
  fn get_volumes(Self) -> Array[Volume] = _
  fn connect_drive_changed(Self, (VolumeMonitor, Drive) -> Unit) -> UInt64 = _
  fn connect_drive_connected(Self, (VolumeMonitor, Drive) -> Unit) -> UInt64 = _
  fn connect_drive_disconnected(Self, (VolumeMonitor, Drive) -> Unit) -> UInt64 = _
  fn connect_drive_eject_button(Self, (VolumeMonitor, Drive) -> Unit) -> UInt64 = _
  fn connect_drive_stop_button(Self, (VolumeMonitor, Drive) -> Unit) -> UInt64 = _
  fn connect_mount_added(Self, (VolumeMonitor, Mount) -> Unit) -> UInt64 = _
  fn connect_mount_changed(Self, (VolumeMonitor, Mount) -> Unit) -> UInt64 = _
  fn connect_mount_pre_unmount(Self, (VolumeMonitor, Mount) -> Unit) -> UInt64 = _
  fn connect_mount_removed(Self, (VolumeMonitor, Mount) -> Unit) -> UInt64 = _
  fn connect_volume_added(Self, (VolumeMonitor, Volume) -> Unit) -> UInt64 = _
  fn connect_volume_changed(Self, (VolumeMonitor, Volume) -> Unit) -> UInt64 = _
  fn connect_volume_removed(Self, (VolumeMonitor, Volume) -> Unit) -> UInt64 = _
}

///|
pub impl IVolumeMonitor for VolumeMonitor with fn as_volume_monitor(self) {
  self
}

///|
/// Implementation contract for VolumeMonitor.drive_changed. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorDriveChanged {
  fn drive_changed(Self, VolumeMonitor, &IDrive) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.drive_connected. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorDriveConnected {
  fn drive_connected(Self, VolumeMonitor, &IDrive) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.drive_disconnected. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorDriveDisconnected {
  fn drive_disconnected(Self, VolumeMonitor, &IDrive) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.drive_eject_button. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorDriveEjectButton {
  fn drive_eject_button(Self, VolumeMonitor, &IDrive) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.drive_stop_button. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorDriveStopButton {
  fn drive_stop_button(Self, VolumeMonitor, &IDrive) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.mount_added. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorMountAdded {
  fn mount_added(Self, VolumeMonitor, &IMount) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.mount_changed. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorMountChanged {
  fn mount_changed(Self, VolumeMonitor, &IMount) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.mount_pre_unmount. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorMountPreUnmount {
  fn mount_pre_unmount(Self, VolumeMonitor, &IMount) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.mount_removed. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorMountRemoved {
  fn mount_removed(Self, VolumeMonitor, &IMount) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.volume_added. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorVolumeAdded {
  fn volume_added(Self, VolumeMonitor, &IVolume) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.volume_changed. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorVolumeChanged {
  fn volume_changed(Self, VolumeMonitor, &IVolume) -> Unit
}

///|
/// Implementation contract for VolumeMonitor.volume_removed. Self is the retained MoonBit state; the second parameter is the invoked VolumeMonitor object.
pub(open) trait VVolumeMonitorVolumeRemoved {
  fn volume_removed(Self, VolumeMonitor, &IVolume) -> Unit
}

///|
/// [Upstream documentation](https://docs.gtk.org/gio/type_func.VolumeMonitor.get.html).
pub extern "c" fn VolumeMonitor::get() -> VolumeMonitor = "moonbit_g_volume_monitor_get"

///|
#borrow(self_, result)
extern "c" fn moonbit_g_volume_monitor_get_connected_drives(
  self_ : VolumeMonitor,
  result : Ref[FixedArray[Drive]],
) = "moonbit_g_volume_monitor_get_connected_drives"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.VolumeMonitor.get_connected_drives.html).
pub fn VolumeMonitor::get_connected_drives(
  self : VolumeMonitor,
) -> Array[Drive] {
  let result_ref : Ref[FixedArray[Drive]] = Ref([])
  moonbit_g_volume_monitor_get_connected_drives(self, result_ref)
  let values : Array[Drive] = Array::new(capacity=result_ref.val.length())
  for value in result_ref.val {
    values.push(value)
  }
  values
}

///|
#borrow(self_, uuid)
extern "c" fn moonbit_g_volume_monitor_get_mount_for_uuid(
  self_ : VolumeMonitor,
  uuid : Bytes,
) -> @glib.Nullable[Mount] = "moonbit_g_volume_monitor_get_mount_for_uuid"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.VolumeMonitor.get_mount_for_uuid.html).
pub fn VolumeMonitor::get_mount_for_uuid(
  self : VolumeMonitor,
  uuid : String,
) -> Mount? {
  let raw_result = moonbit_g_volume_monitor_get_mount_for_uuid(
    self,
    @encoding/utf8.encode(uuid),
  )
  raw_result.to_option()
}

///|
#borrow(self_, result)
extern "c" fn moonbit_g_volume_monitor_get_mounts(
  self_ : VolumeMonitor,
  result : Ref[FixedArray[Mount]],
) = "moonbit_g_volume_monitor_get_mounts"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.VolumeMonitor.get_mounts.html).
pub fn VolumeMonitor::get_mounts(self : VolumeMonitor) -> Array[Mount] {
  let result_ref : Ref[FixedArray[Mount]] = Ref([])
  moonbit_g_volume_monitor_get_mounts(self, result_ref)
  let values : Array[Mount] = Array::new(capacity=result_ref.val.length())
  for value in result_ref.val {
    values.push(value)
  }
  values
}

///|
#borrow(self_, uuid)
extern "c" fn moonbit_g_volume_monitor_get_volume_for_uuid(
  self_ : VolumeMonitor,
  uuid : Bytes,
) -> @glib.Nullable[Volume] = "moonbit_g_volume_monitor_get_volume_for_uuid"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.VolumeMonitor.get_volume_for_uuid.html).
pub fn VolumeMonitor::get_volume_for_uuid(
  self : VolumeMonitor,
  uuid : String,
) -> Volume? {
  let raw_result = moonbit_g_volume_monitor_get_volume_for_uuid(
    self,
    @encoding/utf8.encode(uuid),
  )
  raw_result.to_option()
}

///|
#borrow(self_, result)
extern "c" fn moonbit_g_volume_monitor_get_volumes(
  self_ : VolumeMonitor,
  result : Ref[FixedArray[Volume]],
) = "moonbit_g_volume_monitor_get_volumes"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.VolumeMonitor.get_volumes.html).
pub fn VolumeMonitor::get_volumes(self : VolumeMonitor) -> Array[Volume] {
  let result_ref : Ref[FixedArray[Volume]] = Ref([])
  moonbit_g_volume_monitor_get_volumes(self, result_ref)
  let values : Array[Volume] = Array::new(capacity=result_ref.val.length())
  for value in result_ref.val {
    values.push(value)
  }
  values
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_drive_changed(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Drive, (VolumeMonitor, Drive) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_drive_changed"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.drive-changed.html).
pub fn VolumeMonitor::connect_drive_changed(
  self : VolumeMonitor,
  f : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_drive_changed(
    self,
    fn(instance_, drive, f) { f(instance_, drive) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_drive_connected(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Drive, (VolumeMonitor, Drive) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_drive_connected"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.drive-connected.html).
pub fn VolumeMonitor::connect_drive_connected(
  self : VolumeMonitor,
  f : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_drive_connected(
    self,
    fn(instance_, drive, f) { f(instance_, drive) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_drive_disconnected(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Drive, (VolumeMonitor, Drive) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_drive_disconnected"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.drive-disconnected.html).
pub fn VolumeMonitor::connect_drive_disconnected(
  self : VolumeMonitor,
  f : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_drive_disconnected(
    self,
    fn(instance_, drive, f) { f(instance_, drive) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_drive_eject_button(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Drive, (VolumeMonitor, Drive) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_drive_eject_button"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.drive-eject-button.html).
pub fn VolumeMonitor::connect_drive_eject_button(
  self : VolumeMonitor,
  f : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_drive_eject_button(
    self,
    fn(instance_, drive, f) { f(instance_, drive) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_drive_stop_button(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Drive, (VolumeMonitor, Drive) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_drive_stop_button"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.drive-stop-button.html).
pub fn VolumeMonitor::connect_drive_stop_button(
  self : VolumeMonitor,
  f : (VolumeMonitor, Drive) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_drive_stop_button(
    self,
    fn(instance_, drive, f) { f(instance_, drive) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_mount_added(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Mount, (VolumeMonitor, Mount) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_mount_added"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.mount-added.html).
pub fn VolumeMonitor::connect_mount_added(
  self : VolumeMonitor,
  f : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_mount_added(
    self,
    fn(instance_, mount, f) { f(instance_, mount) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_mount_changed(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Mount, (VolumeMonitor, Mount) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_mount_changed"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.mount-changed.html).
pub fn VolumeMonitor::connect_mount_changed(
  self : VolumeMonitor,
  f : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_mount_changed(
    self,
    fn(instance_, mount, f) { f(instance_, mount) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_mount_pre_unmount(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Mount, (VolumeMonitor, Mount) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_mount_pre_unmount"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.mount-pre-unmount.html).
pub fn VolumeMonitor::connect_mount_pre_unmount(
  self : VolumeMonitor,
  f : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_mount_pre_unmount(
    self,
    fn(instance_, mount, f) { f(instance_, mount) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_mount_removed(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Mount, (VolumeMonitor, Mount) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_mount_removed"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.mount-removed.html).
pub fn VolumeMonitor::connect_mount_removed(
  self : VolumeMonitor,
  f : (VolumeMonitor, Mount) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_mount_removed(
    self,
    fn(instance_, mount, f) { f(instance_, mount) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_volume_added(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Volume, (VolumeMonitor, Volume) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Volume) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_volume_added"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.volume-added.html).
pub fn VolumeMonitor::connect_volume_added(
  self : VolumeMonitor,
  f : (VolumeMonitor, Volume) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_volume_added(
    self,
    fn(instance_, volume, f) { f(instance_, volume) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_volume_changed(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Volume, (VolumeMonitor, Volume) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Volume) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_volume_changed"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.volume-changed.html).
pub fn VolumeMonitor::connect_volume_changed(
  self : VolumeMonitor,
  f : (VolumeMonitor, Volume) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_volume_changed(
    self,
    fn(instance_, volume, f) { f(instance_, volume) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn g_volume_monitor_connect_volume_removed(
  instance : VolumeMonitor,
  function : FuncRef[
    (VolumeMonitor, Volume, (VolumeMonitor, Volume) -> Unit) -> Unit,
  ],
  closure : (VolumeMonitor, Volume) -> Unit,
) -> UInt64 = "moonbit_g_volume_monitor_connect_volume_removed"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/signal.VolumeMonitor.volume-removed.html).
pub fn VolumeMonitor::connect_volume_removed(
  self : VolumeMonitor,
  f : (VolumeMonitor, Volume) -> Unit,
) -> UInt64 {
  g_volume_monitor_connect_volume_removed(
    self,
    fn(instance_, volume, f) { f(instance_, volume) },
    f,
  )
}

///|
impl IVolumeMonitor with fn get_connected_drives(self) -> Array[Drive] {
  self.as_volume_monitor().get_connected_drives()
}

///|
impl IVolumeMonitor with fn get_mount_for_uuid(self, uuid) -> Mount? {
  self.as_volume_monitor().get_mount_for_uuid(uuid)
}

///|
impl IVolumeMonitor with fn get_mounts(self) -> Array[Mount] {
  self.as_volume_monitor().get_mounts()
}

///|
impl IVolumeMonitor with fn get_volume_for_uuid(self, uuid) -> Volume? {
  self.as_volume_monitor().get_volume_for_uuid(uuid)
}

///|
impl IVolumeMonitor with fn get_volumes(self) -> Array[Volume] {
  self.as_volume_monitor().get_volumes()
}

///|
impl IVolumeMonitor with fn connect_drive_changed(self, f) -> UInt64 {
  self.as_volume_monitor().connect_drive_changed(f)
}

///|
impl IVolumeMonitor with fn connect_drive_connected(self, f) -> UInt64 {
  self.as_volume_monitor().connect_drive_connected(f)
}

///|
impl IVolumeMonitor with fn connect_drive_disconnected(self, f) -> UInt64 {
  self.as_volume_monitor().connect_drive_disconnected(f)
}

///|
impl IVolumeMonitor with fn connect_drive_eject_button(self, f) -> UInt64 {
  self.as_volume_monitor().connect_drive_eject_button(f)
}

///|
impl IVolumeMonitor with fn connect_drive_stop_button(self, f) -> UInt64 {
  self.as_volume_monitor().connect_drive_stop_button(f)
}

///|
impl IVolumeMonitor with fn connect_mount_added(self, f) -> UInt64 {
  self.as_volume_monitor().connect_mount_added(f)
}

///|
impl IVolumeMonitor with fn connect_mount_changed(self, f) -> UInt64 {
  self.as_volume_monitor().connect_mount_changed(f)
}

///|
impl IVolumeMonitor with fn connect_mount_pre_unmount(self, f) -> UInt64 {
  self.as_volume_monitor().connect_mount_pre_unmount(f)
}

///|
impl IVolumeMonitor with fn connect_mount_removed(self, f) -> UInt64 {
  self.as_volume_monitor().connect_mount_removed(f)
}

///|
impl IVolumeMonitor with fn connect_volume_added(self, f) -> UInt64 {
  self.as_volume_monitor().connect_volume_added(f)
}

///|
impl IVolumeMonitor with fn connect_volume_changed(self, f) -> UInt64 {
  self.as_volume_monitor().connect_volume_changed(f)
}

///|
impl IVolumeMonitor with fn connect_volume_removed(self, f) -> UInt64 {
  self.as_volume_monitor().connect_volume_removed(f)
}

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

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