///|
async fn run(args : ArrayView[String]) -> Int32 {
  let normalized : Array[String] = []
  let mut options = true
  let mut value_next = false
  for arg in args {
    if value_next {
      normalized.push(arg)
      value_next = false
      continue
    }
    if arg == "--" {
      options = false
    }
    if options &&
      arg.length() > 1 &&
      arg[0] == '-' &&
      arg[1:].iter().all(c => c >= '0' && c <= '9') {
      normalized.push("--width=" + arg[1:].to_owned())
    } else {
      normalized.push(arg)
    }
    if options {
      value_next = ["--width", "--goal", "--prefix"].contains(arg)
      if arg.has_prefix("-") && !arg.has_prefix("--") {
        for offset in 1..= 0 && width <= 2500 else {
    fail("width must be between 0 and 2500")
  }
  let goal = match parsed.last_value("goal") {
    Some(s) => @string.parse_int(s)
    None => width * 187 / 200
  }
  guard goal >= 0 && goal <= width else {
    fail("goal must be nonnegative and at most width")
  }
  if parsed.contains("goal") && requested_width is None {
    width = goal + 10
  }
  let paths = if parsed.operands.is_empty() { ["-"] } else { parsed.operands }
  let mut status = 0
  for path in paths {
    try {
      let data = if path == "-" {
        @stdio.stdin.read_all().binary()
      } else {
        @fs.read_file(path).binary()
      }
      @stdio.stdout.write(
        format(
          data,
          width,
          goal,
          parsed.contains("split-only"),
          parsed.contains("uniform-spacing"),
          crown=parsed.contains("crown-margin"),
          tagged=parsed.contains("tagged-paragraph"),
          prefix=@bytere.argument(parsed.last_value("prefix").unwrap_or("")),
        ),
      )
    } catch {
      err => {
        @stdio.stderr.write("fmt: \{path}: \{err}\n")
        status = 1
      }
    }
  }
  status
}

///|
async fn main {
  let status = run(@env.args()[1:]) catch {
    @cli.CliError(message~, ..) => {
      @stdio.stderr.write("fmt: \{message}\n")
      1
    }
    err => {
      @stdio.stderr.write("fmt: \{err}\n")
      1
    }
  }
  if status != 0 {
    @sys.exit(status)
  }
}