65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
package flags
|
|
|
|
import "github.com/spf13/cobra"
|
|
|
|
// FlagRegistry defines an interface for registering and transferring flags
|
|
type FlagRegistry interface {
|
|
RegisterFlags(cmd *cobra.Command)
|
|
TransferFlags(cmd *cobra.Command, opts interface{})
|
|
GetRegisteredFlagNames() []string
|
|
GetValues() map[string]interface{}
|
|
IsFlagRegistered(name string) bool
|
|
}
|
|
|
|
// GenericFlagRegistry is a base struct for flag registries
|
|
type GenericFlagRegistry struct {
|
|
// Map of flag names to their values
|
|
values map[string]interface{}
|
|
}
|
|
|
|
// NewGenericFlagRegistry creates a new GenericFlagRegistrar
|
|
func NewGenericFlagRegistry() *GenericFlagRegistry {
|
|
return &GenericFlagRegistry{
|
|
values: make(map[string]interface{}),
|
|
}
|
|
}
|
|
|
|
// GetValues returns the internal values map
|
|
func (r *GenericFlagRegistry) GetValues() map[string]interface{} {
|
|
return r.values
|
|
}
|
|
|
|
// GetRegisteredFlagNames returns the names of all registered flags
|
|
func (r *GenericFlagRegistry) GetRegisteredFlagNames() []string {
|
|
names := make([]string, 0, len(r.values))
|
|
for name := range r.values {
|
|
names = append(names, name)
|
|
}
|
|
return names
|
|
}
|
|
|
|
// IsFlagRegistered checks if a flag is registered in the registry
|
|
func (r *GenericFlagRegistry) IsFlagRegistered(name string) bool {
|
|
_, exists := r.values[name]
|
|
return exists
|
|
}
|
|
|
|
// TransferFlags transfers all registered flags to the options
|
|
func (r *GenericFlagRegistry) TransferFlags(cmd *cobra.Command, opts interface{}) {
|
|
if handler, ok := opts.(FlagHandler); ok {
|
|
flags := cmd.Flags()
|
|
|
|
// Transfer each registered flag
|
|
for name, value := range r.values {
|
|
changed := flags.Changed(name)
|
|
handler.HandleFlag(name, value, changed)
|
|
}
|
|
}
|
|
}
|
|
|
|
// RegisterBoolFlag registers a boolean flag and stores its reference
|
|
func (r *GenericFlagRegistry) RegisterBoolFlag(cmd *cobra.Command, name string, value *bool, defaultValue bool, usage string) {
|
|
cmd.Flags().BoolVar(value, name, defaultValue, usage)
|
|
r.values[name] = value
|
|
}
|