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

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

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.

Expand ▾ Collapse ▴



    genconfig generates boilerplate configuration/registration code.

    Source Files