From 5fbd4c83f6e70a66c555fc7ace7dda2c056b8663 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Cornell=C3=A0?= <hello@mcornella.com>
Date: Tue, 28 Dec 2021 11:42:17 +0100
Subject: [PATCH] refactor(cargo): generate completion file in the background

---
 plugins/cargo/cargo.plugin.zsh | 45 +++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 22 deletions(-)

diff --git a/plugins/cargo/cargo.plugin.zsh b/plugins/cargo/cargo.plugin.zsh
index 7082d2d55..9d1d23757 100644
--- a/plugins/cargo/cargo.plugin.zsh
+++ b/plugins/cargo/cargo.plugin.zsh
@@ -1,23 +1,24 @@
-if (( $+commands[rustup] && $+commands[cargo] )); then
-  # remove old generated completion file
-  command rm -f "${0:A:h}/_cargo"
-
-  # generate new completion file
-  ver="$(cargo --version)"
-  ver_file="$ZSH_CACHE_DIR/cargo_version"
-  comp_file="$ZSH_CACHE_DIR/completions/_cargo"
-
-  mkdir -p "${comp_file:h}"
-  (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
-
-  if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
-    rustup completions zsh cargo >| "$comp_file"
-    echo "$ver" >| "$ver_file"
-  fi
-
-  declare -A _comps
-  autoload -Uz _cargo
-  _comps[cargo]=_cargo
-
-  unset ver ver_file comp_file
+if ! (( $+commands[rustup] && $+commands[cargo] )); then
+  return
 fi
+
+# Remove old generated completion file
+# TODO: 2021-09-15: remove this line
+command rm -f "${0:A:h}/_cargo"
+
+# Add completions/ folder in $ZSH_CACHE_DIR
+comp_file="$ZSH_CACHE_DIR/completions/_cargo"
+command mkdir -p "${comp_file:h}"
+(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `cargo`. Otherwise, compinit will have already done that
+if [[ ! -f "$comp_file" ]]; then
+  autoload -Uz _cargo
+  declare -A _comps
+  _comps[cargo]=_cargo
+fi
+
+# Generate completion file in the background
+rustup completions zsh cargo >| "$comp_file" &|
+unset comp_file