github.com/safing/portbase@v0.19.5/config/release.go (about)

     1  package config
     2  
     3  import (
     4  	"sync/atomic"
     5  
     6  	"github.com/tevino/abool"
     7  )
     8  
     9  // ReleaseLevel is used to define the maturity of a
    10  // configuration setting.
    11  type ReleaseLevel uint8
    12  
    13  // Release Level constants.
    14  const (
    15  	ReleaseLevelStable       ReleaseLevel = 0
    16  	ReleaseLevelBeta         ReleaseLevel = 1
    17  	ReleaseLevelExperimental ReleaseLevel = 2
    18  
    19  	ReleaseLevelNameStable       = "stable"
    20  	ReleaseLevelNameBeta         = "beta"
    21  	ReleaseLevelNameExperimental = "experimental"
    22  
    23  	releaseLevelKey = "core/releaseLevel"
    24  )
    25  
    26  var (
    27  	releaseLevel           = new(int32)
    28  	releaseLevelOption     *Option
    29  	releaseLevelOptionFlag = abool.New()
    30  )
    31  
    32  func init() {
    33  	registerReleaseLevelOption()
    34  }
    35  
    36  func registerReleaseLevelOption() {
    37  	releaseLevelOption = &Option{
    38  		Name:           "Feature Stability",
    39  		Key:            releaseLevelKey,
    40  		Description:    `May break things. Decide if you want to experiment with unstable features. "Beta" has been tested roughly by the Safing team while "Experimental" is really raw. When "Beta" or "Experimental" are disabled, their settings use the default again.`,
    41  		OptType:        OptTypeString,
    42  		ExpertiseLevel: ExpertiseLevelDeveloper,
    43  		ReleaseLevel:   ReleaseLevelStable,
    44  		DefaultValue:   ReleaseLevelNameStable,
    45  		Annotations: Annotations{
    46  			DisplayOrderAnnotation: -8,
    47  			DisplayHintAnnotation:  DisplayHintOneOf,
    48  			CategoryAnnotation:     "Updates",
    49  		},
    50  		PossibleValues: []PossibleValue{
    51  			{
    52  				Name:        "Stable",
    53  				Value:       ReleaseLevelNameStable,
    54  				Description: "Only show stable features.",
    55  			},
    56  			{
    57  				Name:        "Beta",
    58  				Value:       ReleaseLevelNameBeta,
    59  				Description: "Show stable and beta features.",
    60  			},
    61  			{
    62  				Name:        "Experimental",
    63  				Value:       ReleaseLevelNameExperimental,
    64  				Description: "Show all features",
    65  			},
    66  		},
    67  	}
    68  
    69  	err := Register(releaseLevelOption)
    70  	if err != nil {
    71  		panic(err)
    72  	}
    73  
    74  	releaseLevelOptionFlag.Set()
    75  }
    76  
    77  func updateReleaseLevel() {
    78  	// get value
    79  	value := releaseLevelOption.activeFallbackValue
    80  	if releaseLevelOption.activeValue != nil {
    81  		value = releaseLevelOption.activeValue
    82  	}
    83  	if releaseLevelOption.activeDefaultValue != nil {
    84  		value = releaseLevelOption.activeDefaultValue
    85  	}
    86  	// set atomic value
    87  	switch value.stringVal {
    88  	case ReleaseLevelNameStable:
    89  		atomic.StoreInt32(releaseLevel, int32(ReleaseLevelStable))
    90  	case ReleaseLevelNameBeta:
    91  		atomic.StoreInt32(releaseLevel, int32(ReleaseLevelBeta))
    92  	case ReleaseLevelNameExperimental:
    93  		atomic.StoreInt32(releaseLevel, int32(ReleaseLevelExperimental))
    94  	default:
    95  		atomic.StoreInt32(releaseLevel, int32(ReleaseLevelStable))
    96  	}
    97  }
    98  
    99  func getReleaseLevel() ReleaseLevel {
   100  	return ReleaseLevel(atomic.LoadInt32(releaseLevel))
   101  }