///|
/// Cross-reference format used when serializing a document.
///
/// Classic writes a traditional xref table and trailer. XRefStream writes an
/// uncompressed xref stream, and CompressedXRefStream wraps that stream in
/// Flate compression.
pub(all) enum PdfWriteMode {
  PdfWriteClassic
  PdfWriteXRefStream
  PdfWriteCompressedXRefStream
} derive(Debug, Eq, ToJson)

///|
/// Encryption options for `pdf_write_document_options`.
///
/// Passwords are stored as owned PDF bytes so callers can pass borrowed
/// `BytesView` values safely.
pub(all) struct PdfWriteEncryption {
  encryption_method : PdfEncryptionMethod
  user_password : PdfBytes
  owner_password : PdfBytes
  denied_permissions : Array[PdfPermission]
} derive(Debug, Eq, ToJson)

///|
/// Build owned encryption options for the writer options API.
pub fn pdf_write_encryption(
  encryption_method : PdfEncryptionMethod,
  user_password : BytesView,
  owner_password : BytesView,
  denied_permissions : ArrayView[PdfPermission],
) -> PdfWriteEncryption {
  let permissions : Array[PdfPermission] = []
  for permission in denied_permissions {
    permissions.push(permission)
  }
  {
    encryption_method,
    user_password: user_password.to_owned(),
    owner_password: owner_password.to_owned(),
    denied_permissions: permissions,
  }
}