///|
async fn main {
  let args = @env.args()[1:]
  let parsed = @cli.parse(args, [
    @cli.flag("quiet", short='q'),
    @cli.option("output-document", short='O'),
    @cli.option("output-file", short='o'),
    @cli.option("idle-timeout"),
    @cli.flag("help"),
  ]) catch {
    @cli.CliError(option~, message~, ..) => {
      @stdio.stderr.write("wget: \{message}: '\{option}'\n")
      @sys.exit(2)
      return
    }
  }
  if parsed.contains("help") {
    @stdio.stdout.write(
      "Usage: wget [-q] [-O FILE] [--idle-timeout SECONDS] URL\n",
    )
    return
  }
  let urls = parsed.operands
  if urls.length() != 1 {
    @stdio.stderr.write("wget: exactly one URL is required\n")
    @sys.exit(2)
    return
  }
  let output_path = parsed.last_value("output-document")
  let error_path = parsed.last_value("output-file")
  let quiet = parsed.contains("quiet")
  let timeout_text = parsed.last_value("idle-timeout").unwrap_or("30")
  let idle_timeout_ms = @cli.parse_idle_timeout(timeout_text) catch {
    @cli.CliError(message~, ..) => {
      @stdio.stderr.write("wget: \{message}\n")
      @sys.exit(2)
      return
    }
  }
  let destination = match output_path {
    Some("-") => None
    Some(path) => Some(path)
    None => Some(@path.Path(urls[0]).basename().to_owned())
  }
  @netops.fetch_with_options(
    urls[0],
    destination,
    @netops.fetch_options_with_feedback(
      true,
      idle_timeout_ms,
      if quiet {
        @netops.FeedbackMode::ErrorsOnly
      } else {
        @netops.FeedbackMode::Progress
      },
      "wget",
      diagnostic_path=error_path,
    ),
  ) catch {
    @netops.NetOpError(_) => {
      @sys.exit(1)
      return
    }
    err => {
      ignore(err)
      @sys.exit(1)
      return
    }
  }
}