helmfile/pkg/common/map_flag.go

70 lines
1.9 KiB
Go

package common
// MapFlag represents a string map flag that tracks whether it was explicitly set
type MapFlag interface {
// Value returns a copy of the current map value
Value() map[string]string
// WasExplicitlySet returns whether the flag was explicitly set
WasExplicitlySet() bool
// Set sets the value and marks the flag as explicitly set
Set(value map[string]string)
// SetKey sets a specific key-value pair and marks the flag as explicitly set
SetKey(key, value string)
}
// mapFlag is the implementation of MapFlag
type mapFlag struct {
value map[string]string
wasExplicitlySet bool
}
// NewMapFlag creates a new MapFlag with default values
func NewMapFlag(defaultValue map[string]string) MapFlag {
// Create a copy of the default value to avoid modifying the original
valueCopy := make(map[string]string, len(defaultValue))
for k, v := range defaultValue {
valueCopy[k] = v
}
return &mapFlag{
value: valueCopy,
wasExplicitlySet: false,
}
}
// Value returns a copy of the current map value
func (mf *mapFlag) Value() map[string]string {
// Create a copy to prevent external modification of internal state
result := make(map[string]string, len(mf.value))
for k, v := range mf.value {
result[k] = v
}
return result
}
// WasExplicitlySet returns whether the flag was explicitly set
func (mf *mapFlag) WasExplicitlySet() bool {
return mf.wasExplicitlySet
}
// Set sets the value and marks the flag as explicitly set
func (mf *mapFlag) Set(value map[string]string) {
// Create a copy of the value to avoid modifying the original
valueCopy := make(map[string]string, len(value))
for k, v := range value {
valueCopy[k] = v
}
mf.value = valueCopy
mf.wasExplicitlySet = true
}
// SetKey sets a specific key-value pair and marks the flag as explicitly set
func (mf *mapFlag) SetKey(key, value string) {
mf.value[key] = value
mf.wasExplicitlySet = true
}