Gofig – a simple (but powerful) config library

Coverage

This was created mainly to use for my own projects, but felt like a good thing to share ❤️

Usage

go get -u github.com/darklam/[email protected]

This example should explain pretty much everything

package main

import (
	"github.com/darklam/gofig"
	"github.com/darklam/gofig/providers"
	"os"
)

type PgConfig struct {
	Username string `env:"PG_USERNAME" key:"USERNAME"`
	Password string `env:"PG_PASSWORD" key:"PASSWORD"`
	Host     string `env:"PG_HOST" key:"HOST"`
	Port     string `env:"PG_PORT" key:"PORT"`
}

type Config struct {
	Port      string    `env:"PORT" default:"3000"`
	Postgres  *PgConfig `provider:"vault" mountPath:"kv" secretPath:"postgres"`
	RedisHost string    `env:"REDIS_HOST" default:"localhost" provider:"vault" mountPath:"kv" secretPath:"redis" key:"HOST"`
}

func main() {
	fig := gofig.NewGofig()
	
	vaultAddress := os.Getenv("VAULT_ADDR")
	roleId := os.Getenv("ROLE_ID")
	secretId := os.Getenv("SECRET_ID")
	vault, err := providers.NewVaultProviderAppRole(vaultAddress, roleId, secretId)
	if err != nil {
		panic(err)
        }
	
	fig.RegisterProvider(vault)
	
	cfg := new(Config)
	
	err = fig.PopulateConfig(cfg)

	if err != nil {
		panic(err)
        }
	
    // The cfg variable now has all the fields populated
}

Available tags

  • provider: The name of the provider responsible for populating this field
  • env: The name of the environment variable to populate the field with
  • default: The default value of the field

You must use at least one of these tags in the struct fields (unless if the field is a struct pointer)

All other tags are provider specific.

Field types

The only supported types are string and a pointer to a struct. If a string then it will be treated as a field to populate. If a struct pointer it will be replaced by an instance of the struct with its fields populated according to the tags of its fields.

Fields for which the value was not found by anything will be empty strings.

Structs are always instantiated.

All fields will be populated recursively. GO nuts!

Tag precedence

  • default
  • env
  • provider

This means that if an env variable is found it will replace the default value and if a value from the provider is retrieved it will replace the env or default values.

Adding more providers

Currently, there’s only the Vault provider with AppRole auth which is what I needed, but I might add more providers in the future.

You can also create custom ones in your code by implementing the interfaces/Provider interface (more documentation there). Please do create a PR to add a new provider if you think it might be useful.

Testing

This module uses moq for mocks, so the first thing you need is to install moq

go install github.com/matryer/[email protected]

Currently using v0.2.7 so keep it the same in case you dug this up 5 years later and there are breaking changes

Then just run

go test -v ./...

Contributing

It’s not a popular package to have specific guidelines. If you have issues or want to add extra functionality (hopefully more providers) feel free to open an issue or even better create a PR.

Just be civil and respectful.

GitHub

View Github