config: Handle errors better

This commit is contained in:
Tom Wiesing 2022-11-23 15:27:58 +01:00
parent 8997f54a8c
commit 55d5c9c529
No known key found for this signature in database
4 changed files with 28 additions and 10 deletions

View file

@ -69,6 +69,10 @@ GRAPHDB_ADMIN_PASSWORD=${GRAPHDB_ADMIN_PASSWORD}
MYSQL_ADMIN_USER=${MYSQL_ADMIN_USER} MYSQL_ADMIN_USER=${MYSQL_ADMIN_USER}
MYSQL_ADMIN_PASSWORD=${MYSQL_ADMIN_PASSWORD} MYSQL_ADMIN_PASSWORD=${MYSQL_ADMIN_PASSWORD}
# The admin user and password required to access the keycloak server and api
KEYCLOAK_ADMIN_USER=${KEYCLOAK_ADMIN_USER}
KEYCLOAK_ADMIN_PASSWORD=${KEYCLOAK_ADMIN_PASSWORD}
# The admin user and password required to access the /dis/ server and api # The admin user and password required to access the /dis/ server and api
DIS_ADMIN_USER=${DIS_ADMIN_USER} DIS_ADMIN_USER=${DIS_ADMIN_USER}
DIS_ADMIN_PASSWORD=${DIS_ADMIN_PASSWORD} DIS_ADMIN_PASSWORD=${DIS_ADMIN_PASSWORD}

View file

@ -7,6 +7,7 @@ import (
"github.com/FAU-CDI/wisski-distillery/pkg/environment" "github.com/FAU-CDI/wisski-distillery/pkg/environment"
"github.com/FAU-CDI/wisski-distillery/pkg/envreader" "github.com/FAU-CDI/wisski-distillery/pkg/envreader"
"github.com/FAU-CDI/wisski-distillery/pkg/stringparser" "github.com/FAU-CDI/wisski-distillery/pkg/stringparser"
"github.com/pkg/errors"
) )
// Unmarshal updates this configuration from the provided [io.Reader]. // Unmarshal updates this configuration from the provided [io.Reader].
@ -45,15 +46,14 @@ func (config *Config) Unmarshal(env environment.Environment, src io.Reader) erro
// read the value with a default // read the value with a default
value, ok := values[tEnv] value, ok := values[tEnv]
if !ok || value == "" { if !ok || value == "" {
if tDefault == "" { if tDefault != "" {
continue value = tDefault
} }
value = tDefault
} }
// parse the value! // parse the value!
if err := stringparser.Parse(env, tParser, value, vField); err != nil { if err := stringparser.Parse(env, tParser, value, vField); err != nil {
return err return errors.Errorf("Config.Unmarshal: Setting %q, Parser %q: %s", tEnv, tParser, err)
} }
} }

View file

@ -20,6 +20,10 @@ type Component interface {
// Name should be implemented by the [ComponentBase] struct. // Name should be implemented by the [ComponentBase] struct.
Name() string Name() string
// ID returns a unique id of this component
// ID should be implemented by the [ComponentBase] struct.
ID() string
// getBase returns the underlying ComponentBase object of this Component. // getBase returns the underlying ComponentBase object of this Component.
// It is used internally during initialization // It is used internally during initialization
getBase() *Base getBase() *Base
@ -27,8 +31,8 @@ type Component interface {
// Base is embedded into every Component // Base is embedded into every Component
type Base struct { type Base struct {
name string // name is the name of this component name, id string // name and id of this component
Still // the underlying still of the distillery Still // the underlying still of the distillery
} }
//lint:ignore U1000 used to implement the private methods of [Component] //lint:ignore U1000 used to implement the private methods of [Component]
@ -41,7 +45,11 @@ func (cb *Base) getBase() *Base {
func Init(component Component, core Still) Component { func Init(component Component, core Still) Component {
base := component.getBase() // pointer to a struct base := component.getBase() // pointer to a struct
base.Still = core base.Still = core
base.name = strings.ToLower(reflect.TypeOf(component).Elem().Name())
tp := reflect.TypeOf(component).Elem()
base.name = strings.ToLower(tp.Name())
base.id = tp.PkgPath() + "." + tp.Name()
return component return component
} }
@ -49,6 +57,10 @@ func (cb Base) Name() string {
return cb.name return cb.name
} }
func (cb Base) ID() string {
return cb.id
}
// Still represents the central part of a distillery. // Still represents the central part of a distillery.
// It is used inside the main distillery struct, as well as every component via [ComponentBase]. // It is used inside the main distillery struct, as well as every component via [ComponentBase].
type Still struct { type Still struct {

View file

@ -8,19 +8,21 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
var errUnknownParser = errors.New("unknown parser")
// Parse parses the provided value with the parser. // Parse parses the provided value with the parser.
func Parse(env environment.Environment, name, value string, vField reflect.Value) error { func Parse(env environment.Environment, name, value string, vField reflect.Value) error {
// use the validator // use the validator
parser, ok := knownParsers[strings.ToLower(name)] parser, ok := knownParsers[strings.ToLower(name)]
if parser == nil || !ok { if parser == nil || !ok {
return errors.Errorf("unknown parser %q", name) return errUnknownParser
} }
// get the parsed value // get the parsed value
checked, err := parser(env, value) checked, err := parser(env, value)
if err != nil { if err != nil {
return errors.Wrapf(err, "parser %s returned error", name) return err
} }
// set the value of the field // set the value of the field
@ -34,7 +36,7 @@ func Parse(env environment.Environment, name, value string, vField reflect.Value
// capture any error // capture any error
if errSet != nil { if errSet != nil {
return errors.Errorf("parser %s: set returned %v", name, errSet) return errors.Errorf("set returned %v", name, errSet)
} }
return nil return nil