iot_server/internal/pkg/processor/processor.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))
}