// GENERATED — DO NOT EDIT

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/struct.Regex.html).
pub type Regex

///|
pub(open) trait IRegex {
  fn as_regex(Self) -> Regex
  fn jit(Self, UInt) -> Bool raise @glib.Error_ = _
  fn ref_(Self) -> Regex = _
  fn substitute(Self, String, String, UInt) -> String raise @glib.Error_ = _
}

///|
pub impl IRegex for Regex with fn as_regex(self) {
  self
}

///|
#borrow(pattern, error)
extern "c" fn moonbit_vte_regex_new_for_match(
  pattern : Bytes,
  pattern_length : Int64,
  flags : UInt,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Regex = "moonbit_vte_regex_new_for_match"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/ctor.Regex.new_for_match.html).
pub fn Regex::new_for_match(
  pattern : String,
  pattern_length : Int64,
  flags : UInt,
) -> Regex raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_vte_regex_new_for_match(
    @encoding/utf8.encode(pattern),
    pattern_length,
    flags,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(pattern, error_offset, error)
extern "c" fn moonbit_vte_regex_new_for_match_full(
  pattern : Bytes,
  pattern_length : Int64,
  flags : UInt,
  extra_flags : UInt,
  error_offset : Ref[UInt64],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Regex = "moonbit_vte_regex_new_for_match_full"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/ctor.Regex.new_for_match_full.html).
pub fn Regex::new_for_match_full(
  pattern : String,
  pattern_length : Int64,
  flags : UInt,
  extra_flags : UInt,
) -> (Regex, UInt64) raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let error_offset = Ref(0UL)
  let result = moonbit_vte_regex_new_for_match_full(
    @encoding/utf8.encode(pattern),
    pattern_length,
    flags,
    extra_flags,
    error_offset,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  (result, error_offset.val)
}

///|
#borrow(pattern, error)
extern "c" fn moonbit_vte_regex_new_for_search(
  pattern : Bytes,
  pattern_length : Int64,
  flags : UInt,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Regex = "moonbit_vte_regex_new_for_search"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/ctor.Regex.new_for_search.html).
pub fn Regex::new_for_search(
  pattern : String,
  pattern_length : Int64,
  flags : UInt,
) -> Regex raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_vte_regex_new_for_search(
    @encoding/utf8.encode(pattern),
    pattern_length,
    flags,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => result
  }
}

///|
#borrow(pattern, error_offset, error)
extern "c" fn moonbit_vte_regex_new_for_search_full(
  pattern : Bytes,
  pattern_length : Int64,
  flags : UInt,
  extra_flags : UInt,
  error_offset : Ref[UInt64],
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Regex = "moonbit_vte_regex_new_for_search_full"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/ctor.Regex.new_for_search_full.html).
pub fn Regex::new_for_search_full(
  pattern : String,
  pattern_length : Int64,
  flags : UInt,
  extra_flags : UInt,
) -> (Regex, UInt64) raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let error_offset = Ref(0UL)
  let result = moonbit_vte_regex_new_for_search_full(
    @encoding/utf8.encode(pattern),
    pattern_length,
    flags,
    extra_flags,
    error_offset,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  (result, error_offset.val)
}

///|
#borrow(self_, error)
extern "c" fn moonbit_vte_regex_jit(
  self_ : Regex,
  flags : UInt,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Bool = "moonbit_vte_regex_jit"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/method.Regex.jit.html).
pub fn Regex::jit(self : Regex, flags : UInt) -> Bool raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_vte_regex_jit(self, flags, error_)
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/method.Regex.ref.html).
#borrow(self)
pub extern "c" fn Regex::ref_(self : Regex) -> Regex = "moonbit_vte_regex_ref"

///|
#borrow(self_, subject, replacement, error)
extern "c" fn moonbit_vte_regex_substitute(
  self_ : Regex,
  subject : Bytes,
  replacement : Bytes,
  flags : UInt,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Bytes = "moonbit_vte_regex_substitute"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/vte/gtk4/method.Regex.substitute.html).
pub fn Regex::substitute(
  self : Regex,
  subject : String,
  replacement : String,
  flags : UInt,
) -> String raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result_ = moonbit_vte_regex_substitute(
    self,
    @encoding/utf8.encode(subject),
    @encoding/utf8.encode(replacement),
    flags,
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  let result = @encoding/utf8.decode_lossy(result_)
  result
}

///|
impl IRegex with fn jit(self, flags) -> Bool raise @glib.Error_ {
  self.as_regex().jit(flags)
}

///|
impl IRegex with fn ref_(self) -> Regex {
  self.as_regex().ref_()
}

///|
impl IRegex with fn substitute(self, subject, replacement, flags) -> String raise @glib.Error_ {
  self.as_regex().substitute(subject, replacement, flags)
}