60 lines
2.0 KiB
Go
60 lines
2.0 KiB
Go
package internal
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/spf13/pflag"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type FlagFunc[T any] func(name string, value T, usage string) *T
|
|
|
|
type FlagPFunc[T any] func(name, shorthand string, value T, usage string) *T
|
|
|
|
// AddFlagAndBind adds a Cobra/pflag flag and binds it with Viper.
|
|
func AddFlagAndBind[T any](v *viper.Viper, fs *pflag.FlagSet, pfn FlagFunc[T], name, bind string, value T, usage string) {
|
|
pfn(name, value, usage)
|
|
|
|
err := v.BindPFlag(bind, fs.Lookup(name))
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to bind flag %s: %v", name, err))
|
|
}
|
|
}
|
|
|
|
// AddFlagAndBindP adds a Cobra/pflag flag and binds it with Viper.
|
|
func AddFlagAndBindP[T any](v *viper.Viper, fs *pflag.FlagSet, pfn FlagPFunc[T], name, shorthand, bind string, value T, usage string) {
|
|
pfn(name, shorthand, value, usage)
|
|
|
|
err := v.BindPFlag(bind, fs.Lookup(name))
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to bind flag %s: %v", name, err))
|
|
}
|
|
}
|
|
|
|
// AddDeprecatedFlagAndBind similar to AddFlagAndBind but deprecate the flag.
|
|
func AddDeprecatedFlagAndBind[T any](v *viper.Viper, fs *pflag.FlagSet, pfn FlagFunc[T], name, bind string, value T, usage string) {
|
|
AddFlagAndBind(v, fs, pfn, name, bind, value, usage)
|
|
deprecateFlag(fs, name)
|
|
}
|
|
|
|
// AddHackedStringSliceP Hack for slice, see Loader.applyStringSliceHack.
|
|
func AddHackedStringSliceP(fs *pflag.FlagSet, name, shorthand, usage string) {
|
|
fs.StringSliceP(name, shorthand, nil, usage)
|
|
}
|
|
|
|
// AddHackedStringSlice Hack for slice, see Loader.applyStringSliceHack.
|
|
func AddHackedStringSlice(fs *pflag.FlagSet, name, usage string) {
|
|
AddHackedStringSliceP(fs, name, "", usage)
|
|
}
|
|
|
|
// AddDeprecatedHackedStringSlice similar to AddHackedStringSlice but deprecate the flag.
|
|
func AddDeprecatedHackedStringSlice(fs *pflag.FlagSet, name, usage string) {
|
|
AddHackedStringSlice(fs, name, usage)
|
|
deprecateFlag(fs, name)
|
|
}
|
|
|
|
func deprecateFlag(fs *pflag.FlagSet, name string) {
|
|
_ = fs.MarkHidden(name)
|
|
_ = fs.MarkDeprecated(name, "check the documentation for more information.")
|
|
}
|