package experiments import ( "fmt" "slices" ) type Experiment struct { Name string // The name of the experiment. AllowedValues []string // The values that can enable this experiment. Value string // The version of the experiment that is enabled. } // New creates a new experiment with the given name and sets the values that can // enable it. func New(xName string, allowedValues ...string) Experiment { value := getEnv(xName) x := Experiment{ Name: xName, AllowedValues: allowedValues, Value: value, } xList = append(xList, x) return x } func (x *Experiment) Enabled() bool { return slices.Contains(x.AllowedValues, x.Value) } func (x *Experiment) Active() bool { return len(x.AllowedValues) > 0 } func (x Experiment) Valid() error { if !x.Active() && x.Value != "" { return &InactiveError{ Name: x.Name, } } if !x.Enabled() && x.Value != "" { return &InvalidValueError{ Name: x.Name, AllowedValues: x.AllowedValues, Value: x.Value, } } return nil } func (x Experiment) String() string { if x.Enabled() { return fmt.Sprintf("on (%s)", x.Value) } return "off" }