github.com/awesome-flow/flow@v0.0.3-0.20190918184116-508d75d68a2c/pkg/cfg/default_provider.go (about)

     1  package cfg
     2  
     3  import (
     4  	"github.com/awesome-flow/flow/pkg/types"
     5  )
     6  
     7  // DefaultProvider represents a set of default values.
     8  // Prefer keeping defaults over providing default values local to other
     9  // providers as it guarantees presence of the default values indiffirent to
    10  // the provider set that have been activated.
    11  type DefaultProvider struct {
    12  	weight   int
    13  	registry map[string]types.Value
    14  	ready    chan struct{}
    15  }
    16  
    17  var (
    18  	defaults map[string]types.Value
    19  )
    20  
    21  func init() {
    22  	defaults = map[string]types.Value{
    23  		CfgPathKey:     "/etc/flowd/flow-config.yaml",
    24  		PluginPathKey:  "/etc/flowd/plugins",
    25  		SystemMaxprocs: 1,
    26  	}
    27  }
    28  
    29  var _ Provider = (*DefaultProvider)(nil)
    30  
    31  // NewDefaultProvider is a constructor for DefaultProvider.
    32  func NewDefaultProvider(repo *Repository, weight int) (*DefaultProvider, error) {
    33  	return NewDefaultProviderWithRegistry(repo, weight, defaults)
    34  }
    35  
    36  // NewDefaultProviderWithRegistry is an alternative constructor for
    37  // DefaultProvider. Accepts an extra registry argument as a complete replacement
    38  // for the default one.
    39  func NewDefaultProviderWithRegistry(repo *Repository, weight int, registry map[string]types.Value) (*DefaultProvider, error) {
    40  	prov := &DefaultProvider{
    41  		weight:   weight,
    42  		registry: registry,
    43  		ready:    make(chan struct{}),
    44  	}
    45  	repo.RegisterProvider(prov)
    46  	return prov, nil
    47  }
    48  
    49  // Name returns provider name: default
    50  func (dp *DefaultProvider) Name() string { return "default" }
    51  
    52  // Depends returns the list of provider dependencies: none
    53  func (dp *DefaultProvider) Depends() []string { return []string{} }
    54  
    55  // Weight returns the provider weight
    56  func (dp *DefaultProvider) Weight() int { return dp.weight }
    57  
    58  // SetUp registers all keys from the registry in the repo
    59  func (dp *DefaultProvider) SetUp(repo *Repository) error {
    60  	defer close(dp.ready)
    61  	for k := range dp.registry {
    62  		if err := repo.RegisterKey(types.NewKey(k), dp); err != nil {
    63  			return err
    64  		}
    65  	}
    66  	return nil
    67  }
    68  
    69  // TearDown is a no-op operation for DefaultProvider
    70  func (dp *DefaultProvider) TearDown(*Repository) error { return nil }
    71  
    72  // Get is the primary method for fetching values from the default registry
    73  func (dp *DefaultProvider) Get(key types.Key) (*types.KeyValue, bool) {
    74  	<-dp.ready
    75  	if val, ok := dp.registry[key.String()]; ok {
    76  		return &types.KeyValue{Key: key, Value: val}, ok
    77  	}
    78  	return nil, false
    79  }