kkyr / Fig
Projects that are alternatives of or similar to Fig
fig
fig is a tiny library for loading an application's config file and its environment into a Go struct. Individual fields can have default values defined or be marked as required.
Why fig?
- Define your configuration, validations and defaults in a single location
- Optionally load from the environment as well
- Only 3 external dependencies
- Full support for
time.Time
&time.Duration
- Tiny API
- Decoders for
.yaml
,.json
and.toml
files
Getting Started
$ go get -d github.com/kkyr/fig
Define your config file:
# config.yaml
build: "2020-01-09T12:30:00Z"
server:
ports:
- 8080
cleanup: 1h
logger:
level: "warn"
trace: true
Define your struct along with validations or defaults:
package main
import (
"fmt"
"github.com/kkyr/fig"
)
type Config struct {
Build time.Time `fig:"build" validate:"required"`
Server struct {
Host string `fig:"host" default:"127.0.0.1"`
Ports []int `fig:"ports" default:"[80,443]"`
Cleanup time.Duration `fig:"cleanup" default:"30m"`
}
Logger struct {
Level string `fig:"level" default:"info"`
Trace bool `fig:"trace"`
}
}
func main() {
var cfg Config
err := fig.Load(&cfg)
// handle your err
fmt.Printf("%+v\n", cfg)
// Output: {Build:2019-12-25 00:00:00 +0000 UTC Server:{Host:127.0.0.1 Ports:[8080] Cleanup:1h0m0s} Logger:{Level:warn Trace:true}}
}
If a field is not set and is marked as required then an error is returned. If a default value is defined instead then that value is used to populate the field.
Fig searches for a file named config.yaml
in the directory it is run from. Change the lookup behaviour by passing additional parameters to Load()
:
fig.Load(&cfg,
fig.File("settings.json"),
fig.Dirs(".", "/etc/myapp", "/home/user/myapp"),
) // searches for ./settings.json, /etc/myapp/settings.json, /home/user/myapp/settings.json
Environment
Need to additionally fill fields from the environment? It's as simple as:
fig.Load(&cfg, fig.UseEnv("MYAPP"))
Usage
See usage examples.
Documentation
See go.dev for detailed documentation.
Contributing
PRs are welcome! Please explain your motivation for the change in your PR and ensure your change is properly tested and documented.