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 }