github.com/safing/portbase@v0.19.5/config/expertise.go (about) 1 package config 2 3 import ( 4 "sync/atomic" 5 6 "github.com/tevino/abool" 7 ) 8 9 // ExpertiseLevel allows to group settings by user expertise. 10 // It's useful if complex or technical settings should be hidden 11 // from the average user while still allowing experts and developers 12 // to change deep configuration settings. 13 type ExpertiseLevel uint8 14 15 // Expertise Level constants. 16 const ( 17 ExpertiseLevelUser ExpertiseLevel = 0 18 ExpertiseLevelExpert ExpertiseLevel = 1 19 ExpertiseLevelDeveloper ExpertiseLevel = 2 20 21 ExpertiseLevelNameUser = "user" 22 ExpertiseLevelNameExpert = "expert" 23 ExpertiseLevelNameDeveloper = "developer" 24 25 expertiseLevelKey = "core/expertiseLevel" 26 ) 27 28 var ( 29 expertiseLevelOption *Option 30 expertiseLevel = new(int32) 31 expertiseLevelOptionFlag = abool.New() 32 ) 33 34 func init() { 35 registerExpertiseLevelOption() 36 } 37 38 func registerExpertiseLevelOption() { 39 expertiseLevelOption = &Option{ 40 Name: "UI Mode", 41 Key: expertiseLevelKey, 42 Description: "Control the default amount of settings and information shown. Hidden settings are still in effect. Can be changed temporarily in the top right corner.", 43 OptType: OptTypeString, 44 ExpertiseLevel: ExpertiseLevelUser, 45 ReleaseLevel: ReleaseLevelStable, 46 DefaultValue: ExpertiseLevelNameUser, 47 Annotations: Annotations{ 48 DisplayOrderAnnotation: -16, 49 DisplayHintAnnotation: DisplayHintOneOf, 50 CategoryAnnotation: "User Interface", 51 }, 52 PossibleValues: []PossibleValue{ 53 { 54 Name: "Simple Interface", 55 Value: ExpertiseLevelNameUser, 56 Description: "Hide complex settings and information.", 57 }, 58 { 59 Name: "Advanced Interface", 60 Value: ExpertiseLevelNameExpert, 61 Description: "Show technical details.", 62 }, 63 { 64 Name: "Developer Interface", 65 Value: ExpertiseLevelNameDeveloper, 66 Description: "Developer mode. Please be careful!", 67 }, 68 }, 69 } 70 71 err := Register(expertiseLevelOption) 72 if err != nil { 73 panic(err) 74 } 75 76 expertiseLevelOptionFlag.Set() 77 } 78 79 func updateExpertiseLevel() { 80 // get value 81 value := expertiseLevelOption.activeFallbackValue 82 if expertiseLevelOption.activeValue != nil { 83 value = expertiseLevelOption.activeValue 84 } 85 if expertiseLevelOption.activeDefaultValue != nil { 86 value = expertiseLevelOption.activeDefaultValue 87 } 88 // set atomic value 89 switch value.stringVal { 90 case ExpertiseLevelNameUser: 91 atomic.StoreInt32(expertiseLevel, int32(ExpertiseLevelUser)) 92 case ExpertiseLevelNameExpert: 93 atomic.StoreInt32(expertiseLevel, int32(ExpertiseLevelExpert)) 94 case ExpertiseLevelNameDeveloper: 95 atomic.StoreInt32(expertiseLevel, int32(ExpertiseLevelDeveloper)) 96 default: 97 atomic.StoreInt32(expertiseLevel, int32(ExpertiseLevelUser)) 98 } 99 } 100 101 // GetExpertiseLevel returns the current active expertise level. 102 func GetExpertiseLevel() uint8 { 103 return uint8(atomic.LoadInt32(expertiseLevel)) 104 }