Skip to content
Snippets Groups Projects
Select Git revision
  • aa0ccb8a253386e276cac360426c039460650e04
  • master default protected
  • v1.22.9
  • v1.22.8
  • v1.22.7
  • v1.22.6
  • v1.22.5
  • v1.22.4
  • v1.22.3
  • v1.22.1
  • v1.22.0
  • v1.21.0
  • v1.20.5
  • v1.20.4
  • v1.20.3
  • v1.20.2
  • v1.20.1
  • v1.20.0
  • v1.19.0
  • v1.18.3
  • v1.18.2
  • v1.18.1
22 results

settings.go

Blame
  • settings.go 1.46 KiB
    // Copyright 2022 schukai GmbH
    // SPDX-License-Identifier: AGPL-3.0
    
    package configuration
    
    import (
    	"github.com/fsnotify/fsnotify"
    	"reflect"
    	"strconv"
    	"sync"
    )
    
    type fileWatch struct {
    	sync.Mutex
    	watcher     *fsnotify.Watcher
    	watchList   map[string]bool
    	cancelWatch chan bool
    	onWatch     bool
    }
    
    // Settings is the main struct for the configuration
    type Settings[C any] struct {
    	files  fileBackend
    	stream streamBackend
    	config C
    	errors []error
    	sync.Mutex
    	mnemonic      string
    	importCounter int
    	hooks         struct {
    		change []ChangeHook
    		error  []ErrorHook
    	}
    
    	fileWatch fileWatch
    }
    
    func (s *Settings[C]) initDefaults() *Settings[C] {
    
    	errorCount := len(s.errors)
    	defer func() {
    		if len(s.errors) > errorCount {
    			s.notifyErrorHooks()
    		}
    	}()
    
    	err := runOnTags(&s.config, []string{"default"}, func(v string, field reflect.Value) {
    
    		if field.CanSet() {
    			switch field.Kind() {
    			case reflect.String:
    				field.SetString(v)
    			case reflect.Int:
    				intVar, err := strconv.Atoi(v)
    				if err != nil {
    					s.errors = append(s.errors, err)
    					return
    				}
    				field.SetInt(int64(intVar))
    			case reflect.Bool:
    				field.SetBool(v == "true")
    			default:
    				s.errors = append(s.errors, newUnsupportedTypeError(field.Type()))
    			}
    
    		}
    	})
    
    	if err != nil {
    		s.errors = append(s.errors, err)
    	}
    
    	return s
    }
    
    func validateConfig[C any](config C) error {
    	t := reflect.TypeOf(config)
    	if t.Kind() != reflect.Struct {
    		return newUnsupportedTypeError(t)
    	}
    	return nil
    }