github.com/wrgl/wrgl@v0.14.0/pkg/conf/fs/aggregate.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright © 2022 Wrangle Ltd
     3  
     4  package conffs
     5  
     6  import (
     7  	"reflect"
     8  
     9  	"github.com/imdario/mergo"
    10  	"github.com/wrgl/wrgl/pkg/conf"
    11  )
    12  
    13  type ptrTransformer struct {
    14  }
    15  
    16  func (t *ptrTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error {
    17  	if typ.Kind() == reflect.Ptr && typ.Elem().Kind() != reflect.Struct {
    18  		return func(dst, src reflect.Value) error {
    19  			if dst.CanSet() && !src.IsNil() {
    20  				dst.Set(src)
    21  			}
    22  			return nil
    23  		}
    24  	}
    25  	return nil
    26  }
    27  
    28  func (s *Store) aggregateConfig() (*conf.Config, error) {
    29  	localConfig, err := s.readConfig(localPath(s.rootDir))
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  	fp, err := globalConfigPath()
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  	globalConfig, err := s.readConfig(fp)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	sysConfig, err := s.readConfig(systemConfigPath())
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	err = mergo.Merge(globalConfig, localConfig, mergo.WithOverride, mergo.WithTransformers(&ptrTransformer{}))
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  	err = mergo.Merge(sysConfig, globalConfig, mergo.WithOverride, mergo.WithTransformers(&ptrTransformer{}))
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	return sysConfig, nil
    54  }