# See "HOW TO ADD A COMMAND-LINE ARGUMENT" in README-maintainer.

# REMEMBER: if you add an optional_choices or optional_parameter, you
# have to explicitly remember to implement the overloaded config
# method that takes no arguments. Since no generated code will call it
# automatically, there is no automated reminder to do this. If you
# forget, it will be a link error if someone tries to call it.

choices:
  yn:
    - "y"
    - "n"
  password_mode:
    - bytes
    - hex-bytes
    - unicode
    - auto
  stream_data:
    - compress
    - preserve
    - uncompress
  decode_level:
    - none
    - generalized
    - specialized
    - all
  object_streams:
    - disable
    - preserve
    - generate
  remove_unref:
    - auto
    - "yes"
    - "no"
  flatten:
    - all
    - print
    - screen
  json_key:
    # The list of selectable top-level keys id duplicated in the
    # following places: job.yml, QPDFJob::json_schema, and
    # QPDFJob::doJSON.
    - acroform
    - attachments
    - encrypt
    - objectinfo   # only v1
    - objects      # only v1
    - outlines
    - pagelabels
    - pages
    - qpdf         # only v2
  json_output:
    - 2
    - latest
  json_stream_data:
    - none
    - inline
    - file
  json_version:
    - 1
    - 2
    - latest
  enc_bits:
    - 40
    - 128
    - 256
  print128:
    - full
    - low
    - none
  modify128:
    - all
    - annotate
    - form
    - assembly
    - none
options:
  - table: help
    bare:
      - version
      - copyright
      - show-crypto
      - job-json-help
    optional_choices:
      json-help: json_version
  - table: main
    config: c_main
    manual:
      - add-attachment
      - copy-attachments-from
      - encrypt
      - overlay
      - pages
      - underlay
      - empty
      - replace-input
      - set-page-labels
    positional: true
    bare:
      - add-attachment
      - allow-weak-crypto
      - check
      - check-linearization
      - coalesce-contents
      - copy-attachments-from
      - decrypt
      - deterministic-id
      - empty
      - encrypt
      - externalize-inline-images
      - filtered-stream-data
      - flatten-rotation
      - generate-appearances
      - ignore-xref-streams
      - is-encrypted
      - json-input
      - keep-inline-images
      - linearize
      - list-attachments
      - newline-before-endstream
      - no-original-object-ids
      - no-warn
      - optimize-images
      - overlay
      - pages
      - password-is-hex-key
      - preserve-unreferenced
      - preserve-unreferenced-resources
      - progress
      - qdf
      - raw-stream-data
      - recompress-flate
      - remove-page-labels
      - replace-input
      - report-memory-usage
      - requires-password
      - remove-restrictions
      - set-page-labels
      - show-encryption
      - show-encryption-key
      - show-linearization
      - show-npages
      - show-pages
      - show-xref
      - static-aes-iv
      - static-id
      - suppress-password-recovery
      - suppress-recovery
      - test-json-schema
      - underlay
      - verbose
      - warning-exit-0
      - with-images
    optional_parameter:
      - collate
      - split-pages
    required_parameter:
      compression-level: level
      copy-encryption: file
      encryption-file-password: password
      force-version: version
      ii-min-bytes: minimum
      job-json-file: file
      json-object: trailer
      keep-files-open-threshold: count
      linearize-pass1: filename
      min-version: version
      oi-min-area: minimum
      oi-min-height: minimum
      oi-min-width: minimum
      password: password
      password-file: password
      remove-attachment: attachment
      rotate: "[+|-]angle"
      show-attachment: attachment
      show-object: trailer
      json-stream-prefix: stream-file-prefix
      update-from-json: qpdf-json file
    required_choices:
      compress-streams: yn
      decode-level: decode_level
      flatten-annotations: flatten
      json-key: json_key
      json-stream-data: json_stream_data
      keep-files-open: yn
      normalize-content: yn
      object-streams: object_streams
      password-mode: password_mode
      remove-unreferenced-resources: remove_unref
      stream-data: stream_data
    optional_choices:
      json: json_version
      json-output: json_output
  - table: pages
    config: c_pages
    prefix: Pages
    positional: true
    required_parameter:
      file: file
      range: page-range
      password: password
  - table: encryption
    config: c_main
    prefix: Enc
    positional: true
    manual:
      - user-password
      - owner-password
      - bits
    required_parameter:
      user-password: user_password
      owner-password: owner_password
    required_choices:
      bits: enc_bits
  - table: 40-bit encryption
    config: c_enc
    config_prefix: Enc
    prefix: Enc40
    required_choices:
      extract: yn
      annotate: yn
      print: yn
      modify: yn
  - table: 128-bit encryption
    config: c_enc
    config_prefix: Enc
    prefix: Enc128
    bare:
      - cleartext-metadata
      - force-V4
    required_choices:
      accessibility: yn
      extract: yn
      print: print128
      assemble: yn
      annotate: yn
      form: yn
      modify-other: yn
      modify: modify128
      use-aes: yn
  - table: 256-bit encryption
    config: c_enc
    config_prefix: Enc
    prefix: Enc256
    bare:
      - cleartext-metadata
      - force-R5
      - allow-insecure
    required_choices:
      accessibility: yn
      extract: yn
      print: print128
      assemble: yn
      annotate: yn
      form: yn
      modify-other: yn
      modify: modify128
  - table: underlay/overlay
    config: c_uo
    prefix: UO
    positional: true
    required_parameter:
      file: file
      to: page-range
      from: page-range
      repeat: page-range
      password: password
  - table: attachment
    config: c_att
    prefix: Att
    positional: true
    bare:
      - replace
    required_parameter:
      key: attachment-key
      filename: filename
      creationdate: creation-date
      moddate: modification-date
      mimetype: mime/type
      description: description
  - table: copy attachment
    config: c_copy_att
    prefix: CopyAtt
    positional: true
    required_parameter:
      prefix: prefix
      password: password
  - table: set page labels
    prefix: PageLabels
    positional: true
json:
  # The structure of this section defines what the json input to
  # QPDFJob looks like. If a key starts with underscore, it does not
  # map to a command-line argument. If the value is a string, that is
  # the help information. Otherwise, if the value is null, it has to
  # match a command-line option, and its properties and help come from
  # other information known by generate_auto_job. This information is
  # used to construct a "schema" (as in JSON.hh) for the json input to
  # QPDFJob. The leading underscore is removed. If a key starts with a
  # double underscore, it corresponds to a command-line argument that
  # does not have a counterpart in the JSON. This signals that the
  # command-line argument was not forgotten, but it is otherwise
  # ignored by the JSON. *NOTE*: all keys are converted to camelCase
  # for the schema and must appear that way in the user-supplied json.
  # This makes it more convenient to populate JSON objects in some
  # languages.

  # input
  _inputFile: "input filename"
  main.password:
  password-file:
  empty:
  json-input:
  # output
  _outputFile: "output filename"
  replace-input:
  # output options
  qdf:
  preserve-unreferenced:
  newline-before-endstream:
  normalize-content:
  stream-data:
  compress-streams:
  recompress-flate:
  decode-level:
  decrypt:
  deterministic-id:
  static-aes-iv:
  static-id:
  no-original-object-ids:
  copy-encryption:
  encryption-file-password:
  linearize:
  linearize-pass1:
  object-streams:
  min-version:
  force-version:
  progress:
  split-pages:
  json-output:
  remove-restrictions:
  encrypt:
    user-password:
    owner-password:
    __bits:
    _40bit:
      Enc40.annotate:
      Enc40.extract:
      Enc40.modify:
      Enc40.print:
    _128bit:
      Enc128.accessibility:
      Enc128.annotate:
      Enc128.assemble:
      Enc128.cleartext-metadata:
      Enc128.extract:
      Enc128.form:
      Enc128.modify-other:
      Enc128.modify:
      Enc128.print:
      force-V4:
      use-aes:
    _256bit:
      Enc256.accessibility:
      Enc256.annotate:
      Enc256.assemble:
      Enc256.cleartext-metadata:
      Enc256.extract:
      Enc256.form:
      Enc256.modify-other:
      Enc256.modify:
      Enc256.print:
      allow-insecure:
      force-R5:
  # inspect
  check:
  check-linearization:
  filtered-stream-data:
  raw-stream-data:
  show-encryption:
  show-encryption-key:
  show-linearization:
  show-npages:
  show-object:
  show-pages:
  show-xref:
  with-images:
  list-attachments:
  show-attachment:
  json:
  json-key:
    - null
  json-object:
    - null
  json-stream-data:
  json-stream-prefix:
  # other options
  update-from-json:
  allow-weak-crypto:
  keep-files-open:
  keep-files-open-threshold:
  no-warn:
  verbose:
  test-json-schema:
  ignore-xref-streams:
  password-is-hex-key:
  password-mode:
  suppress-password-recovery:
  suppress-recovery:
  coalesce-contents:
  compression-level:
  externalize-inline-images:
  ii-min-bytes:
  remove-unreferenced-resources:
  add-attachment:
    - _file: "file to attach"
      creationdate:
      description:
      filename:
      key:
      mimetype:
      moddate:
      replace:
  remove-attachment:
    - null
  copy-attachments-from:
    - _file: "file to copy attachments from"
      CopyAtt.password:
      prefix:
  collate:
  flatten-annotations:
  flatten-rotation:
  generate-appearances:
  keep-inline-images:
  oi-min-area:
  oi-min-height:
  oi-min-width:
  optimize-images:
  pages:
    - Pages.file:
      Pages.password:
      range:
  remove-page-labels:
  report-memory-usage:
  rotate:
  set-page-labels:
    - null
  overlay:
    - UO.file:
      UO.password:
      from:
      repeat:
      to:
  underlay:
    - UO.file:
      UO.password:
      from:
      repeat:
      to:
  warning-exit-0:
  job-json-file:
  preserve-unreferenced-resources:
  requires-password:
  is-encrypted: