///|
/// Return complete table-directory records from a TrueType font.
///
/// This is the first structural pass in `Cpdftruetype.parse`: it reads
/// `numTables`, then each `(tag, checksum, offset, length)` table record.
pub fn pdf_truetype_tables(
  data : BytesView,
) -> Array[@truetype.PdfTrueTypeTableRecord] {
  let records : Array[@truetype.PdfTrueTypeTableRecord] = []
  match pdf_truetype_read_u16(data, 4) {
    Some(table_count) =>
      for index in 0..
            records.push({ tag, checksum, offset, length, })
          _ => break
        }
      }
    None => ()
  }
  records
}

///|
/// Return one table-directory record by tag.
pub fn pdf_truetype_table(
  data : BytesView,
  tag : String,
) -> @truetype.PdfTrueTypeTableRecord? {
  for record in pdf_truetype_tables(data) {
    if record.tag == tag {
      break Some(record)
    }
  } nobreak {
    None
  }
}

///|
fn pdf_truetype_required_table(
  data : BytesView,
  tag : String,
) -> @truetype.PdfTrueTypeTableRecord raise @core.PdfError {
  match pdf_truetype_table(data, tag) {
    Some(record) => record
    None => raise SoftError("No " + tag + " table found in TrueType font")
  }
}

///|
fn pdf_truetype_required_u16(
  data : BytesView,
  offset : Int,
  label : String,
) -> Int raise @core.PdfError {
  match pdf_truetype_read_u16(data, offset) {
    Some(value) => value
    None => raise SoftError("Truncated TrueType " + label)
  }
}

///|
fn pdf_truetype_required_i16(
  data : BytesView,
  offset : Int,
  label : String,
) -> Int raise @core.PdfError {
  match pdf_truetype_read_i16(data, offset) {
    Some(value) => value
    None => raise SoftError("Truncated TrueType " + label)
  }
}

///|
fn pdf_truetype_required_u32_as_int(
  data : BytesView,
  offset : Int,
  label : String,
) -> Int raise @core.PdfError {
  match pdf_truetype_read_u32_as_int(data, offset) {
    Some(value) => value
    None => raise SoftError("Truncated TrueType " + label)
  }
}