// GENERATED — DO NOT EDIT

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

///|
pub(open) trait ITlsInteraction {
  fn as_tls_interaction(Self) -> TlsInteraction
  fn ask_password(Self, &ITlsPassword, &ICancellable?) -> TlsInteractionResult raise @glib.Error_ = _
  fn invoke_ask_password(Self, &ITlsPassword, &ICancellable?) -> TlsInteractionResult raise @glib.Error_ = _
  fn invoke_request_certificate(
    Self,
    &ITlsConnection,
    TlsCertificateRequestFlags,
    &ICancellable?,
  ) -> TlsInteractionResult raise @glib.Error_ = _
  fn request_certificate(
    Self,
    &ITlsConnection,
    TlsCertificateRequestFlags,
    &ICancellable?,
  ) -> TlsInteractionResult raise @glib.Error_ = _
  fn ask_password_async(
    Self,
    &ITlsPassword,
    &ICancellable?,
    (Result[TlsInteractionResult, @glib.Error_]) -> Unit,
  ) -> Unit = _
  fn request_certificate_async(
    Self,
    &ITlsConnection,
    TlsCertificateRequestFlags,
    &ICancellable?,
    (Result[TlsInteractionResult, @glib.Error_]) -> Unit,
  ) -> Unit = _
}

///|
pub impl ITlsInteraction for TlsInteraction with fn as_tls_interaction(self) {
  self
}

///|
#borrow(self_, password, cancellable, error)
extern "c" fn moonbit_g_tls_interaction_ask_password(
  self_ : TlsInteraction,
  password : TlsPassword,
  cancellable : @glib.Nullable[Cancellable],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsInteractionResult = "moonbit_g_tls_interaction_ask_password"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsInteraction.ask_password.html).
pub fn TlsInteraction::ask_password(
  self : TlsInteraction,
  password : &ITlsPassword,
  cancellable : &ICancellable?,
) -> TlsInteractionResult raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_interaction_ask_password(
    self,
    password.as_tls_password(),
    match cancellable {
      Some(v) => @glib.Nullable::some(v.as_cancellable())
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
#borrow(self_, password, cancellable, error)
extern "c" fn moonbit_g_tls_interaction_invoke_ask_password(
  self_ : TlsInteraction,
  password : TlsPassword,
  cancellable : @glib.Nullable[Cancellable],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsInteractionResult = "moonbit_g_tls_interaction_invoke_ask_password"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsInteraction.invoke_ask_password.html).
pub fn TlsInteraction::invoke_ask_password(
  self : TlsInteraction,
  password : &ITlsPassword,
  cancellable : &ICancellable?,
) -> TlsInteractionResult raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_interaction_invoke_ask_password(
    self,
    password.as_tls_password(),
    match cancellable {
      Some(v) => @glib.Nullable::some(v.as_cancellable())
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
#borrow(self_, connection, cancellable, error)
extern "c" fn moonbit_g_tls_interaction_invoke_request_certificate(
  self_ : TlsInteraction,
  connection : TlsConnection,
  flags : Int,
  cancellable : @glib.Nullable[Cancellable],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsInteractionResult = "moonbit_g_tls_interaction_invoke_request_certificate"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsInteraction.invoke_request_certificate.html).
pub fn TlsInteraction::invoke_request_certificate(
  self : TlsInteraction,
  connection : &ITlsConnection,
  flags : TlsCertificateRequestFlags,
  cancellable : &ICancellable?,
) -> TlsInteractionResult raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_interaction_invoke_request_certificate(
    self,
    connection.as_tls_connection(),
    flags.to_int(),
    match cancellable {
      Some(v) => @glib.Nullable::some(v.as_cancellable())
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
#borrow(self_, connection, cancellable, error)
extern "c" fn moonbit_g_tls_interaction_request_certificate(
  self_ : TlsInteraction,
  connection : TlsConnection,
  flags : Int,
  cancellable : @glib.Nullable[Cancellable],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsInteractionResult = "moonbit_g_tls_interaction_request_certificate"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsInteraction.request_certificate.html).
pub fn TlsInteraction::request_certificate(
  self : TlsInteraction,
  connection : &ITlsConnection,
  flags : TlsCertificateRequestFlags,
  cancellable : &ICancellable?,
) -> TlsInteractionResult raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_interaction_request_certificate(
    self,
    connection.as_tls_connection(),
    flags.to_int(),
    match cancellable {
      Some(v) => @glib.Nullable::some(v.as_cancellable())
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
#borrow(self_, password, cancellable)
extern "c" fn g_tls_interaction_ask_password_async(
  self_ : TlsInteraction,
  password : TlsPassword,
  cancellable : @glib.Nullable[Cancellable],
  function : FuncRef[
    (
      TlsInteractionResult,
      @glib.Nullable[@glib.Error_],
      (TlsInteractionResult, @glib.Nullable[@glib.Error_]) -> Unit,
    ) -> Unit,
  ],
  closure : (TlsInteractionResult, @glib.Nullable[@glib.Error_]) -> Unit,
) = "moonbit_g_tls_interaction_ask_password_async"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsInteraction.ask_password_async.html).
pub fn TlsInteraction::ask_password_async(
  self : TlsInteraction,
  password : &ITlsPassword,
  cancellable : &ICancellable?,
  callback : (Result[TlsInteractionResult, @glib.Error_]) -> Unit,
) -> Unit {
  g_tls_interaction_ask_password_async(
    self,
    password.as_tls_password(),
    match cancellable {
      Some(v) => @glib.Nullable::some(v.as_cancellable())
      None => @glib.Nullable::null()
    },
    fn(result, error, f) { f(result, error) },
    fn(result, error) {
      match error.to_option() {
        Some(e) => callback(Err(e))
        None => callback(Ok(result))
      }
    },
  )
}

///|
#borrow(self_, connection, cancellable)
extern "c" fn g_tls_interaction_request_certificate_async(
  self_ : TlsInteraction,
  connection : TlsConnection,
  flags : Int,
  cancellable : @glib.Nullable[Cancellable],
  function : FuncRef[
    (
      TlsInteractionResult,
      @glib.Nullable[@glib.Error_],
      (TlsInteractionResult, @glib.Nullable[@glib.Error_]) -> Unit,
    ) -> Unit,
  ],
  closure : (TlsInteractionResult, @glib.Nullable[@glib.Error_]) -> Unit,
) = "moonbit_g_tls_interaction_request_certificate_async"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsInteraction.request_certificate_async.html).
pub fn TlsInteraction::request_certificate_async(
  self : TlsInteraction,
  connection : &ITlsConnection,
  flags : TlsCertificateRequestFlags,
  cancellable : &ICancellable?,
  callback : (Result[TlsInteractionResult, @glib.Error_]) -> Unit,
) -> Unit {
  g_tls_interaction_request_certificate_async(
    self,
    connection.as_tls_connection(),
    flags.to_int(),
    match cancellable {
      Some(v) => @glib.Nullable::some(v.as_cancellable())
      None => @glib.Nullable::null()
    },
    fn(result, error, f) { f(result, error) },
    fn(result, error) {
      match error.to_option() {
        Some(e) => callback(Err(e))
        None => callback(Ok(result))
      }
    },
  )
}

///|
impl ITlsInteraction with fn ask_password(self, password, cancellable) -> TlsInteractionResult raise @glib.Error_ {
  self.as_tls_interaction().ask_password(password, cancellable)
}

///|
impl ITlsInteraction with fn invoke_ask_password(self, password, cancellable) -> TlsInteractionResult raise @glib.Error_ {
  self.as_tls_interaction().invoke_ask_password(password, cancellable)
}

///|
impl ITlsInteraction with fn invoke_request_certificate(
  self,
  connection,
  flags,
  cancellable,
) -> TlsInteractionResult raise @glib.Error_ {
  self
  .as_tls_interaction()
  .invoke_request_certificate(connection, flags, cancellable)
}

///|
impl ITlsInteraction with fn request_certificate(
  self,
  connection,
  flags,
  cancellable,
) -> TlsInteractionResult raise @glib.Error_ {
  self.as_tls_interaction().request_certificate(connection, flags, cancellable)
}

///|
impl ITlsInteraction with fn ask_password_async(
  self,
  password,
  cancellable,
  callback,
) -> Unit {
  self.as_tls_interaction().ask_password_async(password, cancellable, callback)
}

///|
impl ITlsInteraction with fn request_certificate_async(
  self,
  connection,
  flags,
  cancellable,
  callback,
) -> Unit {
  self
  .as_tls_interaction()
  .request_certificate_async(connection, flags, cancellable, callback)
}

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

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