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  }