func/cmd/completion_util.go

161 lines
3.7 KiB
Go

package cmd
import (
"encoding/json"
"fmt"
"os"
"os/user"
"path"
"strings"
"github.com/spf13/cobra"
fn "knative.dev/func/pkg/functions"
"knative.dev/func/pkg/knative"
)
func CompleteFunctionList(cmd *cobra.Command, args []string, toComplete string) (strings []string, directive cobra.ShellCompDirective) {
lister := knative.NewLister(false)
list, err := lister.List(cmd.Context(), "")
if err != nil {
directive = cobra.ShellCompDirectiveError
return
}
for _, item := range list {
strings = append(strings, item.Name)
}
directive = cobra.ShellCompDirectiveDefault
return
}
func CompleteRuntimeList(cmd *cobra.Command, args []string, toComplete string, client *fn.Client) (matches []string, directive cobra.ShellCompDirective) {
runtimes, err := client.Runtimes()
if err != nil {
fmt.Fprintf(os.Stderr, "error listing runtimes for flag completion: %v", err)
return
}
for _, runtime := range runtimes {
if strings.HasPrefix(runtime, toComplete) {
matches = append(matches, runtime)
}
}
return
}
func CompleteTemplateList(cmd *cobra.Command, args []string, toComplete string, client *fn.Client) (matches []string, directive cobra.ShellCompDirective) {
directive = cobra.ShellCompDirectiveError
lang, err := cmd.Flags().GetString("language")
if err != nil {
fmt.Fprintf(os.Stderr, "cannot list templates: %v", err)
return
}
if lang == "" {
fmt.Fprintln(os.Stderr, "cannot list templates: language not specified")
return
}
templates, err := client.Templates().List(lang)
if err != nil {
fmt.Fprintf(os.Stderr, "cannot list templates: %v", err)
return
}
directive = cobra.ShellCompDirectiveDefault
for _, t := range templates {
if strings.HasPrefix(t, toComplete) {
matches = append(matches, t)
}
}
return
}
func CompleteOutputFormatList(cmd *cobra.Command, args []string, toComplete string) (strings []string, directive cobra.ShellCompDirective) {
directive = cobra.ShellCompDirectiveDefault
strings = []string{"plain", "yaml", "xml", "json"}
return
}
func CompleteRegistryList(cmd *cobra.Command, args []string, toComplete string) (strings []string, directive cobra.ShellCompDirective) {
directive = cobra.ShellCompDirectiveError
u, err := user.Current()
if err != nil {
return
}
file, err := os.Open(path.Join(u.HomeDir, ".docker", "config.json"))
if err != nil {
return
}
decoder := json.NewDecoder(file)
var data map[string]interface{}
err = decoder.Decode(&data)
if err != nil {
return
}
auth, ok := data["auths"].(map[string]interface{})
if !ok {
return
}
strings = make([]string, len(auth))
for reg := range auth {
strings = append(strings, reg)
}
directive = cobra.ShellCompDirectiveDefault
return
}
func CompleteBuilderImageList(cmd *cobra.Command, args []string, complete string) (builderImages []string, directive cobra.ShellCompDirective) {
directive = cobra.ShellCompDirectiveError
var (
err error
path string
f fn.Function
)
path, err = cmd.Flags().GetString("path")
if err != nil {
return
}
f, err = fn.NewFunction(path)
if err != nil {
return
}
builderImages = make([]string, 0, len(f.Build.BuilderImages))
for name := range f.Build.BuilderImages {
if len(complete) == 0 {
builderImages = append(builderImages, name)
continue
}
if strings.HasPrefix(name, complete) {
builderImages = append(builderImages, name)
}
}
directive = cobra.ShellCompDirectiveNoFileComp
return
}
func CompleteBuilderList(cmd *cobra.Command, args []string, complete string) (matches []string, d cobra.ShellCompDirective) {
d = cobra.ShellCompDirectiveNoFileComp
matches = []string{}
if len(complete) == 0 {
matches = KnownBuilders()
return
}
for _, b := range KnownBuilders() {
if strings.HasPrefix(b, complete) {
matches = append(matches, b)
}
}
return
}