2023-07-02 23:07:48 +02:00

69 lines
1.8 KiB
Go

package embed
import (
"strings"
"github.com/rsteube/carapace"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
func subcommandsAsFlags(cmd *cobra.Command, shorthandOnly bool, subcommands ...*cobra.Command) {
carapace.Gen(cmd).PreRun(func(cmd *cobra.Command, args []string) {
flags := pflag.NewFlagSet("subcommands", pflag.ContinueOnError)
for _, s := range subcommands {
switch {
case shorthandOnly:
if len(s.Aliases) > 0 {
flags.BoolS(s.Name(), s.Aliases[0], false, s.Short)
}
// TODO handle misconfiguration
case len(s.Aliases) > 0:
flags.BoolP(s.Name(), s.Aliases[0], false, s.Short) // suppport one alias as shorthand
default:
flags.Bool(s.Name(), false, s.Short)
}
}
switch {
case strings.HasPrefix(args[0], "--"):
flags.Parse(args[:1])
case strings.HasPrefix(args[0], "-") && len(args[0]) > 1:
flags.Parse([]string{args[0][:2]})
}
var subcommand *cobra.Command
flags.Visit(func(f *pflag.Flag) {
for _, s := range subcommands {
if f.Name == s.Name() {
subcommand = s
subcommand.Flags().AddFlag(f)
}
}
})
switch {
case subcommand != nil:
cmd.DisableFlagParsing = true
carapace.Gen(cmd).PositionalAnyCompletion(
carapace.ActionExecute(subcommand),
)
case len(args) < 2:
cmd.Flags().AddFlagSet(flags)
}
})
}
// SubcommandsAsFlags embeds subcommands as flags (e.g. `pacman -Syu` where `S` is actually a subcommand).
// Supports a single alias that is used as shorthand.
func SubcommandsAsFlags(cmd *cobra.Command, subcommands ...*cobra.Command) {
subcommandsAsFlags(cmd, false, subcommands...)
}
// SubcommandsAsFlagsS is like SubcommandsAsFlags but only adds the shorthand.
func SubcommandsAsFlagsS(cmd *cobra.Command, subcommands ...*cobra.Command) {
subcommandsAsFlags(cmd, true, subcommands...)
}