92 lines
2.8 KiB
Go
92 lines
2.8 KiB
Go
package processor
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/pelletier/go-toml/v2"
|
|
"github.com/winc-link/hummingbird/internal/pkg/config"
|
|
"github.com/winc-link/hummingbird/internal/pkg/di"
|
|
"github.com/winc-link/hummingbird/internal/pkg/environment"
|
|
"github.com/winc-link/hummingbird/internal/pkg/flags"
|
|
"github.com/winc-link/hummingbird/internal/pkg/logger"
|
|
"github.com/winc-link/hummingbird/internal/pkg/startup"
|
|
"io/ioutil"
|
|
"sync"
|
|
)
|
|
|
|
// UpdatedStream defines the stream type that is notified by ListenForChanges when a configuration update is received.
|
|
type UpdatedStream chan struct{}
|
|
|
|
type Processor struct {
|
|
Logger logger.LoggingClient
|
|
flags flags.Common
|
|
envVars *environment.Variables
|
|
startupTimer startup.Timer
|
|
ctx context.Context
|
|
wg *sync.WaitGroup
|
|
configUpdated UpdatedStream
|
|
dic *di.Container
|
|
overwriteConfig bool
|
|
}
|
|
|
|
// NewProcessor creates a new configuration Processor
|
|
func NewProcessor(
|
|
flags flags.Common,
|
|
envVars *environment.Variables,
|
|
startupTimer startup.Timer,
|
|
ctx context.Context,
|
|
wg *sync.WaitGroup,
|
|
configUpdated UpdatedStream,
|
|
dic *di.Container,
|
|
) *Processor {
|
|
return &Processor{
|
|
flags: flags,
|
|
envVars: envVars,
|
|
startupTimer: startupTimer,
|
|
ctx: ctx,
|
|
wg: wg,
|
|
configUpdated: configUpdated,
|
|
dic: dic,
|
|
}
|
|
}
|
|
|
|
func (cp *Processor) Process(serviceConfig config.Configuration) error {
|
|
// Create some shorthand for frequently used items
|
|
//envVars := cp.envVars
|
|
|
|
cp.overwriteConfig = cp.flags.OverwriteConfig()
|
|
|
|
// Local configuration must be loaded first in case need registry processor info and/or
|
|
// need to push it to the Configuration Provider.
|
|
if err := cp.loadFromFile(serviceConfig); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// LoadFromFile attempts to read and unmarshal toml-based configuration into a configuration struct.
|
|
func (cp *Processor) loadFromFile(config config.Configuration) error {
|
|
configDir := environment.GetConfDir(cp.Logger, cp.flags.ConfigDirectory())
|
|
contents, err := ioutil.ReadFile(configDir)
|
|
if err != nil {
|
|
return fmt.Errorf("could not load configuration file (%s): %s", configDir, err.Error())
|
|
}
|
|
if err = toml.Unmarshal(contents, config); err != nil {
|
|
return fmt.Errorf("could not load configuration file (%s): %s", configDir, err.Error())
|
|
}
|
|
|
|
fmt.Println(fmt.Sprintf("Loaded configuration from %s", configDir))
|
|
|
|
return nil
|
|
}
|
|
|
|
// logConfigInfo logs the processor info message with number over overrides that occurred.
|
|
func (cp *Processor) logConfigInfo(message string, overrideCount int) {
|
|
if cp.Logger == nil {
|
|
fmt.Println(fmt.Sprintf("%s (%d envVars overrides applied)", message, overrideCount))
|
|
return
|
|
}
|
|
cp.Logger.Info(fmt.Sprintf("%s (%d envVars overrides applied)", message, overrideCount))
|
|
}
|