From 4286d32e2ecafa998d5a388e40d289be5c1e405e Mon Sep 17 00:00:00 2001 From: Cody Bender Date: Mon, 25 Nov 2024 18:13:53 -0500 Subject: [PATCH] feat: add mix completer --- completers/mix_completer/cmd/root.go | 26 +++++++++++++++++++++++++ completers/mix_completer/main.go | 7 +++++++ pkg/actions/tools/mix/mix.go | 29 ++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 completers/mix_completer/cmd/root.go create mode 100644 completers/mix_completer/main.go create mode 100644 pkg/actions/tools/mix/mix.go diff --git a/completers/mix_completer/cmd/root.go b/completers/mix_completer/cmd/root.go new file mode 100644 index 0000000000..b07a54bbfa --- /dev/null +++ b/completers/mix_completer/cmd/root.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "github.com/carapace-sh/carapace" + "github.com/carapace-sh/carapace-bin/pkg/actions/tools/mix" + "github.com/spf13/cobra" +) + +var rootCmd = &cobra.Command{ + Use: "mix", + Short: "A build automation tool for working with applications written in the Elixir programming language", + Long: "https://hexdocs.pm/mix/Mix.html", + Run: func(cmd *cobra.Command, args []string) {}, +} + +func Execute() error { + return rootCmd.Execute() +} + +func init() { + carapace.Gen(rootCmd).Standalone() + + carapace.Gen(rootCmd).PositionalCompletion( + mix.ActionMixTasks(), + ) +} diff --git a/completers/mix_completer/main.go b/completers/mix_completer/main.go new file mode 100644 index 0000000000..dfb1846a1e --- /dev/null +++ b/completers/mix_completer/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/carapace-sh/carapace-bin/completers/mix_completer/cmd" + +func main() { + cmd.Execute() +} diff --git a/pkg/actions/tools/mix/mix.go b/pkg/actions/tools/mix/mix.go new file mode 100644 index 0000000000..5399d5a837 --- /dev/null +++ b/pkg/actions/tools/mix/mix.go @@ -0,0 +1,29 @@ +// package mix contains mix related actions +package mix + +import ( + "regexp" + "strings" + + "github.com/carapace-sh/carapace" +) + +// ActionMixTasks completes mix tasks +// +// install +// deps.get +func ActionMixTasks() carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + return carapace.ActionExecCommand("mix", "help")(func(output []byte) carapace.Action { + lines := strings.Split(string(output), "\n") + r := regexp.MustCompile(`^mix (\S+)\s*# (.*)`) + vals := make([]string, 0) + for _, line := range lines { + if matches := r.FindStringSubmatch(line); matches != nil { + vals = append(vals, matches[1], matches[2]) + } + } + return carapace.ActionValuesDescribed(vals...) + }) + }) +}