Navigation Menu

Skip to content

fvbock/confobject

Repository files navigation

ConfObject

Reloadable, validated configuration from many - sometimes uncontrollable - sources

Build Status GoDoc

Motivation

I had to deal with configuration values that came from a lot of different places and circumstances:

  • a config file or env vars
  • some json or yaml file - possibly stored in a db
  • some of these i had control over - others could be modified by a user in an app that i do not necessarily must have access to to employ validation or control the way things are stored

I also needed:

  • default values, "NOT NULL" like constraints, and validation that involves dependencies between different config values
  • the ability to reload the configs from all its sources in its original order in an easy way

Features

Usage

Cfg := struct {
	Config

	BoolSetting   bool    `default:"true"`
	StringSetting string  `default:"foo" json:"string_setting"`
	IntSetting    int     `required:"false" default:"23" should:"BeGreaterThanOrEqualTo_FloatSetting"`
	FloatSetting  float64 `default:"1.681"`

	SingleValueConfig struct {
		StringSetting string  `default:"bar" json:"single_value_config__string_setting"`
		IntSetting    int     `required:"false" default:"42" should:"BeGreaterThanOrEqualTo_.FloatSetting"`
		FloatSetting  float64 `should:"BeLessThanOrEqualTo_IntSetting"`
	}

	SliceConfig struct {
		StringSliceSetting []string  `default:"foo,bar"`
		IntSliceSetting    []int     `default:"23,42"`
		FloatSliceSetting  []float64 `default:"1.394,1.112"`
	}

	NestedValueConfig struct {
		StringSetting          string `default:"NestedOuterFoo"`
		InnerNestedValueConfig struct {
			StringSetting string `default:"NestedInnerFoo"`
		}
	}

	StringSet *set.StringSet `alias:someNameICantControl`
	IntSet    *set.IntSet
}{}

err = cobj.InitConfig(&Cfg, []cobj.InitFunc{
	cobj.InitFunc{
		F:           loadConfFile,
		ExitOnError: true,
	},
	cobj.InitFunc{
		F:           setupThisOtherThing,
		ExitOnError: false,
	},
}...)


func loadConfFile() (err error) {
	conf := make(map[string]string)

    ...

	err = Cfg.Set(conf)
	return
}

Limitations

TODOs

  • finish writing this file
  • godoc
  • clean up and extend the tests

Questions?

Ping me on twitter

About

Reloadable, validated configuration from (almost) any source

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages