Files
mochi/pkg/conf/config.go
Lawrence, Rendall c1e041b4f8 (wip) fix invalid http compact address encode
* add packages to loggers
* split config examples with different storages
2022-10-25 18:38:55 +03:00

65 lines
1.8 KiB
Go

// Package conf contains alias for map encoded configuration
// and structure unmarshaller
package conf
import (
"errors"
"github.com/mitchellh/mapstructure"
"github.com/rs/zerolog"
)
// TagName is a tag name, used for decoder customization
const TagName = "cfg"
// ErrNilConfigMap returned if unmarshalling map is nil and could not be
// decoded into structure
var ErrNilConfigMap = errors.New("unable to process nil map")
// MapConfig is just alias for map[string]any
type MapConfig map[string]any
// MarshalZerologObject writes map into zerolog event
func (m MapConfig) MarshalZerologObject(e *zerolog.Event) {
e.Fields(map[string]any(m))
}
// Unmarshal decodes receiver map into provided structure.
// Decoder configured to automatically unmarshal inherited structures,
// convert string-ed duration (1s, 2m, 3h...) into time.Duration and
// string representation IP into net.IP.
// Tag used for decode customization is conf.TagName.
func (m MapConfig) Unmarshal(into any) (err error) {
if m != nil {
if len(m) > 0 {
conf := &mapstructure.DecoderConfig{
DecodeHook: mapstructure.ComposeDecodeHookFunc(
mapstructure.StringToTimeDurationHookFunc(),
mapstructure.StringToIPHookFunc(),
),
Squash: true,
Result: into,
TagName: TagName,
}
var decoder *mapstructure.Decoder
if decoder, err = mapstructure.NewDecoder(conf); err == nil {
err = decoder.Decode(m)
}
}
} else {
err = ErrNilConfigMap
}
return
}
// NamedMapConfig encapsulates MapConfig with string Name
type NamedMapConfig struct {
Name string
Config MapConfig
}
// MarshalZerologObject writes Name and Config into zerolog event
func (nm NamedMapConfig) MarshalZerologObject(e *zerolog.Event) {
e.Str("name", nm.Name).Dict("config", zerolog.Dict().EmbedObject(nm.Config))
}