Stært is a Go library for loading and merging a program configuration structure from many sources.
Stært was born in order to merge two sources of Configuration (Flæg, Toml).
We developed flaeg
and staert
in order to simplify configuration maintenance on traefik.
- Load your Configuration structure from many sources
- Keep your Configuration structure values unchanged if no overwriting (support defaults values)
- Two native sources :
- An Interface to add your own sources
- Handle pointers field :
- You can give a structure of default values for pointers
- Same comportment as Flæg
- Stært is Command oriented
- It use
flaeg.Command
- Same comportment as Flæg commands
- It use
It works on your own Configuration structure, like this one :
package example
import (
"fmt"
"github.com/containous/flaeg"
"github.com/containous/staert"
"os"
)
//Configuration is a struct which contains all differents type to field
type Configuration struct {
IntField int `description:"An integer field"`
StringField string `description:"A string field"`
PointerField *PointerSubConfiguration `description:"A pointer field"`
}
//PointerSubConfiguration is a SubStructure Configuration
type PointerSubConfiguration struct {
BoolField bool `description:"A boolean field"`
FloatField float64 `description:"A float field"`
}
Let's initialize it:
func main() {
//Init with default value
config := &Configuration{
IntField: 1,
StringField: "init",
PointerField: &PointerSubConfiguration{
FloatField: 1.1,
},
}
//Set default pointers value
defaultPointersConfig := &Configuration{
PointerField: &PointerSubConfiguration{
BoolField: true,
FloatField: 99.99,
},
}
Stært uses flaeg.Command
Structure, like this :
//Create Command
command:=&flaeg.Command{
Name:"example",
Description:"This is an example of description",
Config:config,
DefaultPointersConfig:defaultPointersConfig,
Run: func() error {
fmt.Printf("Run example with the config :\n%+v\n",config)
fmt.Printf("PointerField contains:%+v\n", config.PointerField)
return nil
}
}
Init Stært
s:=staert.NewStaert(command)
Init TOML source
toml:=staert.NewTomlSource("example", []string{"./toml/", "/any/other/path"})
Init Flæg source
f:=flaeg.New(command, os.Args[1:])
Add TOML and flæg sources
s.AddSource(toml)
s.AddSource(f)
NB : You can change order, so that, flaeg configuration will overwrite toml one
Just call LoadConfig function :
loadedConfig, err := s.LoadConfig();
if err != nil {
//OOPS
}
//DO WATH YOU WANT WITH loadedConfig
//OR CALL RUN FUNC
Run function will call the func run()
from the command :
if err := s.Run(); err != nil {
//OOPS
}
}
NB : If you didn't call LoadConfig()
before, your func run()
will use your original configuration
TOML file ./toml/example.toml
:
IntField= 2
[PointerField]
We can run the example program using folowing CLI arguments :
$ ./example --stringfield=owerwrittenFromFlag --pointerfield.floatfield=55.55
Run example with the config :
&{IntField:2 StringField:owerwrittenFromFlag PointerField:0xc82000ec80}
PointerField contains:&{BoolField:true FloatField:55.55}
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request :D