///|
fn PdfDocument::select_reconstructed_trailer(
  self : PdfDocument,
  trailers : ArrayView[@syntax.PdfObject],
) -> @syntax.PdfObject raise @core.PdfError {
  for offset in 0..
        match self.lookup_object_or_null(root) {
          PdfDictionary(_) => break trailer
          _ => ()
        }
      _ => ()
    }
  } nobreak {
    match self.infer_reconstructed_catalog_trailer() {
      Some(trailer) => trailer
      None => raise RootExpected
    }
  }
}

///|
fn PdfDocument::infer_reconstructed_catalog_trailer(
  self : PdfDocument,
) -> @syntax.PdfObject? {
  for number in self.object_numbers() {
    let object = self.lookup_object_or_null(number)
    match object {
      PdfDictionary(_) =>
        if object.lookup_immediate(pdf_page_type_key()) ==
          Some(PdfNameObject(pdf_page_type_catalog())) &&
          object.lookup_immediate(pdf_page_pages_key()) is Some(_) {
          break Some(
            PdfDictionary([
              (@reader.pdf_reader_root_name(), PdfIndirect(number)),
            ]),
          )
        }
      _ => ()
    }
  } nobreak {
    None
  }
}

///|
fn PdfDocument::set_trailer_and_root(
  self : PdfDocument,
  trailer : @syntax.PdfObject,
) -> Unit raise @core.PdfError {
  self.set_trailer_dict(trailer)
  match trailer.lookup_immediate(@reader.pdf_reader_root_name()) {
    Some(PdfIndirect(root)) => self.set_root(root)
    _ => raise RootExpected
  }
}