///|
#borrow(text, analysis)
extern "c" fn moonbit_pango_shape(
  text : Bytes,
  length : Int,
  analysis : Analysis,
) -> GlyphString = "moonbit_pango_shape"

///|
/// Converts an itemized text segment into glyphs.
pub fn shape(text : String, length : Int, analysis : Analysis) -> GlyphString {
  moonbit_pango_shape(@encoding/utf8.encode(text), length, analysis)
}

///|
#borrow(item_text, paragraph_text, analysis)
extern "c" fn moonbit_pango_shape_full(
  item_text : Bytes,
  item_length : Int,
  paragraph_text : @glib.Nullable[Bytes],
  paragraph_length : Int,
  analysis : Analysis,
) -> GlyphString = "moonbit_pango_shape_full"

///|
/// Shapes an item with optional surrounding paragraph text.
pub fn shape_full(
  item_text : String,
  item_length : Int,
  paragraph_text : String?,
  paragraph_length : Int,
  analysis : Analysis,
) -> GlyphString {
  moonbit_pango_shape_full(
    @encoding/utf8.encode(item_text),
    item_length,
    match paragraph_text {
      Some(text) => @glib.Nullable::some(@encoding/utf8.encode(text))
      None => @glib.Nullable::null()
    },
    paragraph_length,
    analysis,
  )
}

///|
#borrow(item, paragraph_text, log_attrs)
extern "c" fn moonbit_pango_shape_item(
  item : Item,
  paragraph_text : @glib.Nullable[Bytes],
  paragraph_length : Int,
  log_attrs : @glib.Nullable[Ref[FixedArray[LogAttr]]],
  flags : Int,
) -> GlyphString = "moonbit_pango_shape_item"

///|
/// Shapes an item, applying optional logical attributes and shaping flags.
pub fn shape_item(
  item : Item,
  paragraph_text : String?,
  paragraph_length : Int,
  log_attrs : FixedArray[LogAttr]?,
  flags : ShapeFlags,
) -> GlyphString {
  moonbit_pango_shape_item(
    item,
    match paragraph_text {
      Some(text) => @glib.Nullable::some(@encoding/utf8.encode(text))
      None => @glib.Nullable::null()
    },
    paragraph_length,
    match log_attrs {
      Some(attrs) => @glib.Nullable::some(Ref(attrs))
      None => @glib.Nullable::null()
    },
    flags.to_int(),
  )
}

///|
#borrow(item_text, paragraph_text, analysis)
extern "c" fn moonbit_pango_shape_with_flags(
  item_text : Bytes,
  item_length : Int,
  paragraph_text : @glib.Nullable[Bytes],
  paragraph_length : Int,
  analysis : Analysis,
  flags : Int,
) -> GlyphString = "moonbit_pango_shape_with_flags"

///|
/// Shapes an item with optional paragraph context and shaping flags.
pub fn shape_with_flags(
  item_text : String,
  item_length : Int,
  paragraph_text : String?,
  paragraph_length : Int,
  analysis : Analysis,
  flags : ShapeFlags,
) -> GlyphString {
  moonbit_pango_shape_with_flags(
    @encoding/utf8.encode(item_text),
    item_length,
    match paragraph_text {
      Some(text) => @glib.Nullable::some(@encoding/utf8.encode(text))
      None => @glib.Nullable::null()
    },
    paragraph_length,
    analysis,
    flags.to_int(),
  )
}