// GENERATED — DO NOT EDIT

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/class.FontMap.html).
pub type FontMap

///|
pub(open) trait IFontMap {
  fn as_font_map(Self) -> FontMap
  fn add_font_file(Self, String) -> Bool raise @glib.Error_ = _
  fn changed(Self) -> Unit = _
  fn create_context(Self) -> Context = _
  fn get_family(Self, String) -> FontFamily? = _
  fn get_serial(Self) -> UInt = _
  fn list_families(Self) -> Array[FontFamily] = _
  fn load_font(Self, &IContext, FontDescription) -> Font? = _
  fn load_fontset(Self, &IContext, FontDescription, Language) -> Fontset? = _
  fn reload_font(Self, &IFont, Double, &IContext?, String?) -> Font = _
}

///|
pub impl IFontMap for FontMap with fn as_font_map(self) {
  self
}

///|
/// Implementation contract for FontMap.changed. Self is the retained MoonBit state; the second parameter is the invoked FontMap object.
pub(open) trait VFontMapChanged {
  fn changed(Self, FontMap) -> Unit
}

///|
#borrow(self_, filename, error)
extern "c" fn moonbit_pango_font_map_add_font_file(
  self_ : FontMap,
  filename : Bytes,
  error : Ref[@glib.Nullable[@glib.Error_]],
) -> Bool = "moonbit_pango_font_map_add_font_file"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.add_font_file.html).
pub fn FontMap::add_font_file(
  self : FontMap,
  filename : String,
) -> Bool raise @glib.Error_ {
  let error_ : Ref[@glib.Nullable[@glib.Error_]] = Ref(@glib.Nullable::null())
  let result = moonbit_pango_font_map_add_font_file(
    self,
    @encoding/utf8.encode(filename),
    error_,
  )
  match error_.val.to_option() {
    Some(e) => raise e
    None => ()
  }
  result
}

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.changed.html).
#borrow(self)
pub extern "c" fn FontMap::changed(self : FontMap) = "moonbit_pango_font_map_changed"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.create_context.html).
#borrow(self)
pub extern "c" fn FontMap::create_context(self : FontMap) -> Context = "moonbit_pango_font_map_create_context"

///|
#borrow(self_, name)
extern "c" fn moonbit_pango_font_map_get_family(
  self_ : FontMap,
  name : Bytes,
) -> @glib.Nullable[FontFamily] = "moonbit_pango_font_map_get_family"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.get_family.html).
pub fn FontMap::get_family(self : FontMap, name : String) -> FontFamily? {
  let raw_result = moonbit_pango_font_map_get_family(
    self,
    @encoding/utf8.encode(name),
  )
  raw_result.to_option()
}

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.get_serial.html).
#borrow(self)
pub extern "c" fn FontMap::get_serial(self : FontMap) -> UInt = "moonbit_pango_font_map_get_serial"

///|
#borrow(self_, families)
extern "c" fn moonbit_pango_font_map_list_families(
  self_ : FontMap,
  families : Ref[FixedArray[FontFamily]],
) = "moonbit_pango_font_map_list_families"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.list_families.html).
pub fn FontMap::list_families(self : FontMap) -> Array[FontFamily] {
  let families : Ref[FixedArray[FontFamily]] = Ref([])
  moonbit_pango_font_map_list_families(self, families)
  let result : Array[FontFamily] = Array::new(capacity=families.val.length())
  for i in 0.. @glib.Nullable[Font] = "moonbit_pango_font_map_load_font"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.load_font.html).
pub fn FontMap::load_font(
  self : FontMap,
  context : &IContext,
  desc : FontDescription,
) -> Font? {
  let raw_result = moonbit_pango_font_map_load_font(
    self,
    context.as_context(),
    desc,
  )
  raw_result.to_option()
}

///|
#borrow(self_, context, desc, language)
extern "c" fn moonbit_pango_font_map_load_fontset(
  self_ : FontMap,
  context : Context,
  desc : FontDescription,
  language : Language,
) -> @glib.Nullable[Fontset] = "moonbit_pango_font_map_load_fontset"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.load_fontset.html).
pub fn FontMap::load_fontset(
  self : FontMap,
  context : &IContext,
  desc : FontDescription,
  language : Language,
) -> Fontset? {
  let raw_result = moonbit_pango_font_map_load_fontset(
    self,
    context.as_context(),
    desc,
    language,
  )
  raw_result.to_option()
}

///|
#borrow(self_, font, context, variations)
extern "c" fn moonbit_pango_font_map_reload_font(
  self_ : FontMap,
  font : Font,
  scale : Double,
  context : @glib.Nullable[Context],
  variations : @glib.Nullable[Bytes],
) -> Font = "moonbit_pango_font_map_reload_font"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.FontMap.reload_font.html).
pub fn FontMap::reload_font(
  self : FontMap,
  font : &IFont,
  scale : Double,
  context : &IContext?,
  variations : String?,
) -> Font {
  moonbit_pango_font_map_reload_font(
    self,
    font.as_font(),
    scale,
    match context {
      Some(v) => @glib.Nullable::some(v.as_context())
      None => @glib.Nullable::null()
    },
    match variations {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
  )
}

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/property.FontMap.n-items.html).
#borrow(self_)
pub extern "c" fn FontMap::get_n_items(self_ : FontMap) -> UInt = "moonbit_pango_font_map_get_n_items"

///|
impl IFontMap with fn add_font_file(self, filename) -> Bool raise @glib.Error_ {
  self.as_font_map().add_font_file(filename)
}

///|
impl IFontMap with fn changed(self) -> Unit {
  self.as_font_map().changed()
}

///|
impl IFontMap with fn create_context(self) -> Context {
  self.as_font_map().create_context()
}

///|
impl IFontMap with fn get_family(self, name) -> FontFamily? {
  self.as_font_map().get_family(name)
}

///|
impl IFontMap with fn get_serial(self) -> UInt {
  self.as_font_map().get_serial()
}

///|
impl IFontMap with fn list_families(self) -> Array[FontFamily] {
  self.as_font_map().list_families()
}

///|
impl IFontMap with fn load_font(self, context, desc) -> Font? {
  self.as_font_map().load_font(context, desc)
}

///|
impl IFontMap with fn load_fontset(self, context, desc, language) -> Fontset? {
  self.as_font_map().load_fontset(context, desc, language)
}

///|
impl IFontMap with fn reload_font(self, font, scale, context, variations) -> Font {
  self.as_font_map().reload_font(font, scale, context, variations)
}

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

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