genconfig ==== The genconfig tool generates boilerplate code for registering and deserializing configuration objects. ## Usage - Go source Let's say you have an interface called `Foo` with several concrete implmentations, and you'd like to be able to instantiate these implementations by reading JSON configuration files. The first thing you do is create a new interface called `FooConfig` and add a `go:generate` directive to it like so: //go:generate genconfig -o config.go foo Foo type FooConfig interface { FooID() string Foo() ... The first argument is the name of the file to create. The second (`foo`) is the name of the package. The third is the object that is to be configurable. ## Usage - Go Generate To generate (or re-generate) your config file, issue the following command in your shell: ``` go generate github.com/coreos/dex/foo ``` ## Usage - Generated Code API Every time you make a new `Foo` implementation, you should create a new `FooConfig` which configures it, and can return a `Foo`. You should tag `FooConfig` so that it can be serialized/de-serialized as you plesae. After creating the `Config` object, you can register it with the the generated `RegisterFooConfigType`. This allows you to create `NewFooFromType(fooType string)` and also `newFooConfigFromMap`. In practice you will do something like: deserialize a JSON object into a `map[string]interface{}`, pass that map into `newFooConfigFromMap` which gives you your `FooConfig` and then call whatever you've implemented to get a `Foo` from a `FooConfig` ## The Future? There's still a lot of boilerplate that needs to be generated to use this API. It would be nice to generate even more code, with more `go:generate` directives. For example, partial implementations of the XXXConfig objects could be generated, along with functions for deserializing the Config objects (or slices of them) from an io.Reader.