github.com/mendersoftware/go-lib-micro@v0.0.0-20240304135804-e8e39c59b148/config/config.go (about)

     1  // Copyright 2023 Northern.tech AS
     2  //
     3  //	Licensed under the Apache License, Version 2.0 (the "License");
     4  //	you may not use this file except in compliance with the License.
     5  //	You may obtain a copy of the License at
     6  //
     7  //	    http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  //	Unless required by applicable law or agreed to in writing, software
    10  //	distributed under the License is distributed on an "AS IS" BASIS,
    11  //	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  //	See the License for the specific language governing permissions and
    13  //	limitations under the License.
    14  package config
    15  
    16  import (
    17  	"time"
    18  
    19  	"github.com/pkg/errors"
    20  	"github.com/spf13/viper"
    21  )
    22  
    23  var (
    24  	Config = viper.New()
    25  )
    26  
    27  func FromConfigFile(filePath string,
    28  	defaults []Default,
    29  	configValidators ...Validator) error {
    30  
    31  	// Set default values for config
    32  	SetDefaults(Config, defaults)
    33  
    34  	// Find and read the config file
    35  	if filePath != "" {
    36  		Config.SetConfigFile(filePath)
    37  		if err := Config.ReadInConfig(); err != nil {
    38  			return errors.Wrap(err, "failed to read configuration")
    39  		}
    40  	}
    41  
    42  	// Validate config
    43  	if err := ValidateConfig(Config, configValidators...); err != nil {
    44  		return errors.Wrap(err, "failed to validate configuration")
    45  	}
    46  
    47  	return nil
    48  }
    49  
    50  type Reader interface {
    51  	Get(key string) interface{}
    52  	GetBool(key string) bool
    53  	GetFloat64(key string) float64
    54  	GetInt(key string) int
    55  	GetString(key string) string
    56  	GetStringMap(key string) map[string]interface{}
    57  	GetStringMapString(key string) map[string]string
    58  	GetStringSlice(key string) []string
    59  	GetTime(key string) time.Time
    60  	GetDuration(key string) time.Duration
    61  	IsSet(key string) bool
    62  }
    63  
    64  type Writer interface {
    65  	SetDefault(key string, val interface{})
    66  	Set(key string, val interface{})
    67  }
    68  
    69  type Handler interface {
    70  	Reader
    71  	Writer
    72  }
    73  
    74  type Default struct {
    75  	Key   string
    76  	Value interface{}
    77  }
    78  
    79  type Validator func(c Reader) error
    80  
    81  // ValidateConfig validates conifg accroding to provided validators.
    82  func ValidateConfig(c Reader, validators ...Validator) error {
    83  
    84  	for _, validator := range validators {
    85  		err := validator(c)
    86  		if err != nil {
    87  			return err
    88  		}
    89  	}
    90  
    91  	return nil
    92  }
    93  
    94  func SetDefaults(c Writer, defaults []Default) {
    95  	for _, def := range defaults {
    96  		c.SetDefault(def.Key, def.Value)
    97  	}
    98  }