mirror of
https://github.com/grafana/grafana.git
synced 2024-11-23 09:26:43 -06:00
97 lines
2.4 KiB
Go
97 lines
2.4 KiB
Go
package featuremgmt
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
)
|
|
|
|
type FeatureToggles interface {
|
|
IsEnabled(flag string) bool
|
|
}
|
|
|
|
// FeatureFlagState indicates the quality level
|
|
type FeatureFlagState int
|
|
|
|
const (
|
|
// FeatureStateUnknown indicates that no state is specified
|
|
FeatureStateUnknown FeatureFlagState = iota
|
|
|
|
// FeatureStateAlpha the feature is in active development and may change at any time
|
|
FeatureStateAlpha
|
|
|
|
// FeatureStateBeta the feature is still in development, but settings will have migrations
|
|
FeatureStateBeta
|
|
|
|
// FeatureStateStable this is a stable feature
|
|
FeatureStateStable
|
|
|
|
// FeatureStateDeprecated the feature will be removed in the future
|
|
FeatureStateDeprecated
|
|
)
|
|
|
|
func (s FeatureFlagState) String() string {
|
|
switch s {
|
|
case FeatureStateAlpha:
|
|
return "alpha"
|
|
case FeatureStateBeta:
|
|
return "beta"
|
|
case FeatureStateStable:
|
|
return "stable"
|
|
case FeatureStateDeprecated:
|
|
return "deprecated"
|
|
case FeatureStateUnknown:
|
|
}
|
|
return "unknown"
|
|
}
|
|
|
|
// MarshalJSON marshals the enum as a quoted json string
|
|
func (s FeatureFlagState) MarshalJSON() ([]byte, error) {
|
|
buffer := bytes.NewBufferString(`"`)
|
|
buffer.WriteString(s.String())
|
|
buffer.WriteString(`"`)
|
|
return buffer.Bytes(), nil
|
|
}
|
|
|
|
// UnmarshalJSON unmarshals a quoted json string to the enum value
|
|
func (s *FeatureFlagState) UnmarshalJSON(b []byte) error {
|
|
var j string
|
|
err := json.Unmarshal(b, &j)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
switch j {
|
|
case "alpha":
|
|
*s = FeatureStateAlpha
|
|
|
|
case "beta":
|
|
*s = FeatureStateBeta
|
|
|
|
case "stable":
|
|
*s = FeatureStateStable
|
|
|
|
case "deprecated":
|
|
*s = FeatureStateDeprecated
|
|
|
|
default:
|
|
*s = FeatureStateUnknown
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type FeatureFlag struct {
|
|
Name string `json:"name" yaml:"name"` // Unique name
|
|
Description string `json:"description"`
|
|
State FeatureFlagState `json:"state,omitempty"`
|
|
DocsURL string `json:"docsURL,omitempty"`
|
|
|
|
// CEL-GO expression. Using the value "true" will mean this is on by default
|
|
Expression string `json:"expression,omitempty"`
|
|
|
|
// Special behavior flags
|
|
RequiresDevMode bool `json:"requiresDevMode,omitempty"` // can not be enabled in production
|
|
RequiresRestart bool `json:"requiresRestart,omitempty"` // The server must be initialized with the value
|
|
RequiresLicense bool `json:"requiresLicense,omitempty"` // Must be enabled in the license
|
|
FrontendOnly bool `json:"frontend,omitempty"` // change is only seen in the frontend
|
|
}
|