///|
fn pdf_font_name_segments(font_name : String) -> Array[String] {
  let segments : Array[String] = []
  let mut start = 0
  for index in 0.. start {
        segments.push(font_name[start:index].to_owned())
      }
      start = index + 1
    }
  }
  if start < font_name.length() {
    segments.push(font_name[start:].to_owned())
  }
  segments
}

///|
fn pdf_font_segment_name(segment : String) -> @core.PdfName {
  @core.pdf_name_of_bytes(@ascii.encode("/" + segment))
}

///|
/// Resolve a cpdf font name path on a page.
///
/// `font_name` is the name shown by `list_fonts`, such as `/F1` for a page font
/// or `/Fm/FX` for a font inside a Form XObject. Valid pages whose path is not
/// found return `PdfNull`.
pub fn PdfDocument::font_from_name(
  self : PdfDocument,
  font_name : String,
  page_number : Int,
) -> @syntax.PdfObject raise @core.PdfError {
  let pages = self.pages_of_pagetree()
  pdf_page_box_validate_page_numbers(
    [page_number],
    pages.length(),
    "font_from_name",
  )
  let segments = pdf_font_name_segments(font_name)
  if segments.length() == 0 {
    PdfNull
  } else {
    let mut resources = pages[page_number - 1].resources
    let mut found = @syntax.PdfNull
    let mut failed = false
    for index, segment in segments {
      if !failed {
        let key = pdf_font_segment_name(segment)
        if index == segments.length() - 1 {
          match self.lookup_direct(pdf_page_font_resource_name, resources) {
            Some(fonts) =>
              match self.lookup_direct(key, fonts) {
                Some(font) => found = font
                None => failed = true
              }
            None => failed = true
          }
        } else {
          match self.lookup_direct(pdf_page_xobject_key(), resources) {
            Some(xobjects) =>
              match self.lookup_direct(key, xobjects) {
                Some(xobject) =>
                  match self.lookup_direct(pdf_page_resources_key(), xobject) {
                    Some(next_resources) => resources = next_resources
                    None => failed = true
                  }
                None => failed = true
              }
            None => failed = true
          }
        }
      }
    }
    if failed {
      PdfNull
    } else {
      found
    }
  }
}

///|
/// Compatibility wrapper for `PdfDocument::font_from_name`.
pub fn pdf_font_from_name(
  document : PdfDocument,
  font_name : String,
  page_number : Int,
) -> @syntax.PdfObject raise @core.PdfError {
  document.font_from_name(font_name, page_number)
}