Confita is a library that loads configuration from multiple backends and stores it in a struct.
go get -u github.com/heetch/confita
Confita scans a struct for config
tags and calls all the backends one after another until the key is found.
The value is then converted into the type of the field.
Go primitives are supported:
type Config struct {
Host string `config:"host"`
Port uint32 `config:"port"`
Timeout time.Duration `config:"timeout"`
}
By default, all fields are optional. With the required option, if a key is not found then Confita will return an error.
type Config struct {
Addr string `config:"addr,required"`
Timeout time.Duration `config:"timeout"`
}
Nested structs are supported too:
type Config struct {
Host string `config:"host"`
Port uint32 `config:"port"`
Timeout time.Duration `config:"timeout"`
Database struct {
URI string `config:"database-uri,required"`
}
As a special case, if the field tag is "-", the field is always omitted. This is useful if you want to populate this field on your own.
type Config struct {
// Field is ignored by this package.
Field float64 `config:"-"`
// Confita scans any structure recursively, the "-" value prevents that.
Client http.Client `config:"-"`
}
Creating a loader:
loader := confita.NewLoader()
By default, a Confita loader loads all the keys from the environment. A loader can take other configured backends as parameters.
loader := confita.NewLoader(
env.NewBackend(),
file.NewBackend("/path/to/config.json"),
file.NewBackend("/path/to/config.yaml"),
etcd.NewBackend(etcdClientv3, "namespace"),
consul.NewBackend(consulClient, "namespace"),
)
Loading configuration:
err := loader.Load(context.Background(), &cfg)
Since loading configuration can take time when used with multiple remote backends, context can be used for timeout and cancelation:
ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
defer cancel()
err := loader.Load(ctx, &cfg)
If a key is not found, Confita won't change the respective struct field. With that in mind, default values can simply be implemented by filling the structure before passing it to Confita.
type Config struct {
Host string `config:"host"`
Port uint32 `config:"port"`
Timeout time.Duration `config:"timeout"`
Password string `config:"password,required"`
}
// default values
cfg := Config{
Host: "127.0.0.1",
Port: "5656",
Timeout: 5 * time.Second,
}
err := confita.NewLoader().Load(context.Background(), &cfg)
The library is released under the MIT license. See LICENSE file.