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
 | 
						|
}
 |