feat: add completion command

Add a command to generate a completion script for bash, zsh, fish and powershell shells.
In order to generate the fish script the cobra package has been bumped to 1.0.0

Change-Id: Ie38e4754e74bc6ea9784e5ea4375d8d41abf3b04
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/6380
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cmd/cue/cmd/completion.go b/cmd/cue/cmd/completion.go
new file mode 100644
index 0000000..3deca46
--- /dev/null
+++ b/cmd/cue/cmd/completion.go
@@ -0,0 +1,79 @@
+// Copyright 2019 CUE Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cmd
+
+import (
+	"fmt"
+
+	"github.com/spf13/cobra"
+)
+
+var validCompletionArgs = []string{"bash", "zsh", "fish", "powershell"}
+
+const completionExample = `
+Bash:
+
+$ source <(cue completion bash)
+
+# To load completions for each session, execute once:
+Linux:
+  $ cue completion bash > /etc/bash_completion.d/cue
+MacOS:
+  $ cue completion bash > /usr/local/etc/bash_completion.d/cue
+
+Zsh:
+
+$ source <(cue completion zsh)
+
+# To load completions for each session, execute once:
+$ cue completion zsh > "${fpath[1]}/_cue"
+
+Fish:
+
+$ cue completion fish | source
+
+# To load completions for each session, execute once:
+$ cue completion fish > ~/.config/fish/completions/cue.fish
+`
+
+func newCompletionCmd(c *Command) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:       fmt.Sprintf("completion %s", validCompletionArgs),
+		Short:     "Generate completion script",
+		Long:      ``,
+		Example:   completionExample,
+		ValidArgs: validCompletionArgs,
+		Args:      cobra.ExactValidArgs(1),
+		RunE:      mkRunE(c, runCompletion),
+	}
+	return cmd
+}
+
+func runCompletion(cmd *Command, args []string) error {
+	w := cmd.OutOrStdout()
+	switch args[0] {
+	case "bash":
+		cmd.Root().GenBashCompletion(w)
+	case "zsh":
+		cmd.Root().GenZshCompletion(w)
+	case "fish":
+		cmd.Root().GenFishCompletion(w, true)
+	case "powershell":
+		cmd.Root().GenPowerShellCompletion(w)
+	default:
+		return fmt.Errorf("%s is not a supported shell", args[0])
+	}
+	return nil
+}
diff --git a/cmd/cue/cmd/root.go b/cmd/cue/cmd/root.go
index f7497dd..fd65bed 100644
--- a/cmd/cue/cmd/root.go
+++ b/cmd/cue/cmd/root.go
@@ -88,6 +88,7 @@
 
 	subCommands := []*cobra.Command{
 		cmdCmd,
+		newCompletionCmd(c),
 		newEvalCmd(c),
 		newDefCmd(c),
 		newExportCmd(c),
diff --git a/go.mod b/go.mod
index 43b48b9..6d02bdd 100644
--- a/go.mod
+++ b/go.mod
@@ -11,7 +11,7 @@
 	github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de
 	github.com/pkg/errors v0.8.1 // indirect
 	github.com/rogpeppe/go-internal v1.6.0
-	github.com/spf13/cobra v0.0.7
+	github.com/spf13/cobra v1.0.0
 	github.com/spf13/pflag v1.0.3
 	github.com/stretchr/testify v1.2.2
 	golang.org/x/exp v0.0.0-20200513190911-00229845015e
diff --git a/go.sum b/go.sum
index 519de26..ce97cc0 100644
--- a/go.sum
+++ b/go.sum
@@ -99,8 +99,8 @@
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU=
-github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
+github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
+github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=