mirror of
https://github.com/rsteube/carapace-bin.git
synced 2025-05-16 04:34:32 +00:00
69 lines
1.8 KiB
Go
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...)
|
|
}
|