///|
priv suberror UnlinkError {
  UnlinkError(String)
}

///|
fn reject_directory(path : String) -> Unit raise UnlinkError {
  raise UnlinkError("cannot unlink '\{path}': is a directory")
}

///|
async fn unlink_one(path : String) -> Unit raise UnlinkError {
  let kind = @fs.kind(path, follow_symlink=false) catch {
    err => raise UnlinkError("cannot unlink '\{path}': \{err}")
  }
  match kind {
    Directory => reject_directory(path)
    _ =>
      @fs.remove(path) catch {
        err => raise UnlinkError("cannot unlink '\{path}': \{err}")
      }
  }
}

///|
async fn main {
  let args = @env.args()[1:]
  let parsed = @cli.parse(args, [@cli.flag("help"), @cli.flag("version")]) catch {
    @cli.CliError(option~, message~, ..) => {
      @stdio.stderr.write("unlink: \{message}: '\{option}'\n")
      @sys.exit(2)
      return
    }
  }
  if parsed.contains("help") {
    @stdio.stdout.write("Usage: unlink FILE...\n")
    return
  }
  if parsed.contains("version") {
    @stdio.stdout.write("unlink (moonbit cmd) \{command_version}\n")
    return
  }
  if parsed.operands.is_empty() {
    @stdio.stderr.write("unlink: missing operand\n")
    @sys.exit(1)
    return
  }
  let mut failed = false
  for path in parsed.operands {
    unlink_one(path) catch {
      UnlinkError(message) => {
        @stdio.stderr.write("unlink: \{message}\n")
        failed = true
        continue
      }
    }
  }
  if failed {
    @sys.exit(1)
  }
}