///|
async fn main {
  run(@env.args())
}

///|
pub async fn run(args : Array[String], quiet? : Bool = false) -> Unit {
  if args.length() < 2 || args.length() > 3 {
    if !quiet {
      println("Syntax: pdftext  [output]")
    }
    return
  }
  let in_file = args[1]
  let out_file = if args.length() == 3 { Some(args[2]) } else { None }
  try {
    let pdf = @pdfreadfs.PdfReadFs::new().pdf_of_file(None, None, in_file)
    if @pdfcrypt.PdfCrypt::new().is_encrypted(pdf) {
      fail("File is encrypted.")
    }
    let text = @pdftext.PdfText::new(pdf).extract_text()
    match out_file {
      Some(path) =>
        @fs.write_file(
          path,
          text,
          create_mode=CreateOrTruncate,
          permission=0o644,
        )
      None => if !quiet { println(text) }
    }
  } catch {
    err =>
      if !quiet {
        println("Failed to extract text.")
        println(err)
      }
  }
}