// GENERATED — DO NOT EDIT

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

///|
pub(open) trait ITlsCertificate {
  fn as_tls_certificate(Self) -> TlsCertificate
  fn get_issuer(Self) -> TlsCertificate? = _
  fn get_issuer_name(Self) -> String? = _
  fn get_subject_name(Self) -> String? = _
  fn is_same(Self, &ITlsCertificate) -> Bool = _
  fn verify(Self, &ISocketConnectable?, &ITlsCertificate?) -> TlsCertificateFlags = _
}

///|
pub impl ITlsCertificate for TlsCertificate with fn as_tls_certificate(self) {
  self
}

///|
#borrow(file, error)
extern "c" fn moonbit_g_tls_certificate_new_from_file(
  file : Bytes,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsCertificate = "moonbit_g_tls_certificate_new_from_file"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.TlsCertificate.new_from_file.html).
pub fn TlsCertificate::new_from_file(
  file : String,
) -> TlsCertificate raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_certificate_new_from_file(
    @encoding/utf8.encode(file),
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(file, password, error)
extern "c" fn moonbit_g_tls_certificate_new_from_file_with_password(
  file : Bytes,
  password : Bytes,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsCertificate = "moonbit_g_tls_certificate_new_from_file_with_password"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.TlsCertificate.new_from_file_with_password.html).
pub fn TlsCertificate::new_from_file_with_password(
  file : String,
  password : String,
) -> TlsCertificate raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_certificate_new_from_file_with_password(
    @encoding/utf8.encode(file),
    @encoding/utf8.encode(password),
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(cert_file, key_file, error)
extern "c" fn moonbit_g_tls_certificate_new_from_files(
  cert_file : Bytes,
  key_file : Bytes,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsCertificate = "moonbit_g_tls_certificate_new_from_files"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.TlsCertificate.new_from_files.html).
pub fn TlsCertificate::new_from_files(
  cert_file : String,
  key_file : String,
) -> TlsCertificate raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_certificate_new_from_files(
    @encoding/utf8.encode(cert_file),
    @encoding/utf8.encode(key_file),
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(data, error)
extern "c" fn moonbit_g_tls_certificate_new_from_pem(
  data : Bytes,
  length : Int64,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsCertificate = "moonbit_g_tls_certificate_new_from_pem"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.TlsCertificate.new_from_pem.html).
pub fn TlsCertificate::new_from_pem(
  data : String,
  length : Int64,
) -> TlsCertificate raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_certificate_new_from_pem(
    @encoding/utf8.encode(data),
    length,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(pkcs11_uri, private_key_pkcs11_uri, error)
extern "c" fn moonbit_g_tls_certificate_new_from_pkcs11_uris(
  pkcs11_uri : Bytes,
  private_key_pkcs11_uri : @glib.Nullable[Bytes],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> TlsCertificate = "moonbit_g_tls_certificate_new_from_pkcs11_uris"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/ctor.TlsCertificate.new_from_pkcs11_uris.html).
pub fn TlsCertificate::new_from_pkcs11_uris(
  pkcs11_uri : String,
  private_key_pkcs11_uri : String?,
) -> TlsCertificate raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_g_tls_certificate_new_from_pkcs11_uris(
    @encoding/utf8.encode(pkcs11_uri),
    match private_key_pkcs11_uri {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(file, error, result)
extern "c" fn moonbit_g_tls_certificate_list_new_from_file(
  file : Bytes,
  error : Ref[@glib.Nullable[@glib.Error_]],
  result : Ref[FixedArray[TlsCertificate]],
) = "moonbit_g_tls_certificate_list_new_from_file"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/type_func.TlsCertificate.list_new_from_file.html).
pub fn TlsCertificate::list_new_from_file(
  file : String,
) -> Array[TlsCertificate] raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result_ref : Ref[FixedArray[TlsCertificate]] = Ref([])
  moonbit_g_tls_certificate_list_new_from_file(
    @encoding/utf8.encode(file),
    error_,
    result_ref,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  let values : Array[TlsCertificate] = Array::new(
    capacity=result_ref.val.length(),
  )
  for value in result_ref.val {
    values.push(value)
  }
  values
}

///|
#borrow(self_)
extern "c" fn moonbit_g_tls_certificate_get_issuer(
  self_ : TlsCertificate,
) -> @glib.Nullable[TlsCertificate] = "moonbit_g_tls_certificate_get_issuer"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsCertificate.get_issuer.html).
pub fn TlsCertificate::get_issuer(self : TlsCertificate) -> TlsCertificate? {
  let raw_result = moonbit_g_tls_certificate_get_issuer(self)
  raw_result.to_option()
}

///|
#borrow(self_)
extern "c" fn moonbit_g_tls_certificate_get_issuer_name(
  self_ : TlsCertificate,
) -> @glib.Nullable[Bytes] = "moonbit_g_tls_certificate_get_issuer_name"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsCertificate.get_issuer_name.html).
pub fn TlsCertificate::get_issuer_name(self : TlsCertificate) -> String? {
  let result = moonbit_g_tls_certificate_get_issuer_name(self)
  match result.to_option() {
    Some(bytes) => Some(@encoding/utf8.decode_lossy(bytes))
    None => None
  }
}

///|
#borrow(self_)
extern "c" fn moonbit_g_tls_certificate_get_subject_name(
  self_ : TlsCertificate,
) -> @glib.Nullable[Bytes] = "moonbit_g_tls_certificate_get_subject_name"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsCertificate.get_subject_name.html).
pub fn TlsCertificate::get_subject_name(self : TlsCertificate) -> String? {
  let result = moonbit_g_tls_certificate_get_subject_name(self)
  match result.to_option() {
    Some(bytes) => Some(@encoding/utf8.decode_lossy(bytes))
    None => None
  }
}

///|
#borrow(self_, cert_two)
extern "c" fn moonbit_g_tls_certificate_is_same(
  self_ : TlsCertificate,
  cert_two : TlsCertificate,
) -> Bool = "moonbit_g_tls_certificate_is_same"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsCertificate.is_same.html).
pub fn TlsCertificate::is_same(
  self : TlsCertificate,
  cert_two : &ITlsCertificate,
) -> Bool {
  moonbit_g_tls_certificate_is_same(self, cert_two.as_tls_certificate())
}

///|
#borrow(self_, identity, trusted_ca)
extern "c" fn moonbit_g_tls_certificate_verify(
  self_ : TlsCertificate,
  identity : @glib.Nullable[SocketConnectable],
  trusted_ca : @glib.Nullable[TlsCertificate],
) -> Int = "moonbit_g_tls_certificate_verify"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/method.TlsCertificate.verify.html).
pub fn TlsCertificate::verify(
  self : TlsCertificate,
  identity : &ISocketConnectable?,
  trusted_ca : &ITlsCertificate?,
) -> TlsCertificateFlags {
  TlsCertificateFlags::from_int(
    moonbit_g_tls_certificate_verify(
      self,
      match identity {
        Some(v) => @glib.Nullable::some(v.as_socket_connectable())
        None => @glib.Nullable::null()
      },
      match trusted_ca {
        Some(v) => @glib.Nullable::some(v.as_tls_certificate())
        None => @glib.Nullable::null()
      },
    ),
  )
}

///|
#borrow(self_)
extern "c" fn moonbit_g_tls_certificate_get_certificate_pem(
  self_ : TlsCertificate,
) -> Bytes = "moonbit_g_tls_certificate_get_certificate_pem"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/property.TlsCertificate.certificate-pem.html).
pub fn TlsCertificate::get_certificate_pem(self : TlsCertificate) -> String {
  @encoding/utf8.decode_lossy(
    moonbit_g_tls_certificate_get_certificate_pem(self),
  )
}

///|
#borrow(self_)
extern "c" fn moonbit_g_tls_certificate_get_pkcs11_uri(
  self_ : TlsCertificate,
) -> Bytes = "moonbit_g_tls_certificate_get_pkcs11_uri"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/property.TlsCertificate.pkcs11-uri.html).
pub fn TlsCertificate::get_pkcs11_uri(self : TlsCertificate) -> String {
  @encoding/utf8.decode_lossy(moonbit_g_tls_certificate_get_pkcs11_uri(self))
}

///|
#borrow(self_)
extern "c" fn moonbit_g_tls_certificate_get_private_key_pem(
  self_ : TlsCertificate,
) -> Bytes = "moonbit_g_tls_certificate_get_private_key_pem"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/property.TlsCertificate.private-key-pem.html).
pub fn TlsCertificate::get_private_key_pem(self : TlsCertificate) -> String {
  @encoding/utf8.decode_lossy(
    moonbit_g_tls_certificate_get_private_key_pem(self),
  )
}

///|
#borrow(self_)
extern "c" fn moonbit_g_tls_certificate_get_private_key_pkcs11_uri(
  self_ : TlsCertificate,
) -> Bytes = "moonbit_g_tls_certificate_get_private_key_pkcs11_uri"

///|
/// [Upstream documentation](https://docs.gtk.org/gio/property.TlsCertificate.private-key-pkcs11-uri.html).
pub fn TlsCertificate::get_private_key_pkcs11_uri(
  self : TlsCertificate,
) -> String {
  @encoding/utf8.decode_lossy(
    moonbit_g_tls_certificate_get_private_key_pkcs11_uri(self),
  )
}

///|
impl ITlsCertificate with fn get_issuer(self) -> TlsCertificate? {
  self.as_tls_certificate().get_issuer()
}

///|
impl ITlsCertificate with fn get_issuer_name(self) -> String? {
  self.as_tls_certificate().get_issuer_name()
}

///|
impl ITlsCertificate with fn get_subject_name(self) -> String? {
  self.as_tls_certificate().get_subject_name()
}

///|
impl ITlsCertificate with fn is_same(self, cert_two) -> Bool {
  self.as_tls_certificate().is_same(cert_two)
}

///|
impl ITlsCertificate with fn verify(self, identity, trusted_ca) -> TlsCertificateFlags {
  self.as_tls_certificate().verify(identity, trusted_ca)
}

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

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