gofigure

Documentation
Login

Package gofigure parses configuration files. An application might use this instead of parsing JSON, YAML, or many other alternatives.

Our primary goals include:

Our definition of "human-friendly" is opinionated. It basically means a configuration file format that supports comments, and is not sensitive to whitespace or indentation.

The motivation to avoid third-party dependencies is to minimize the amount of code that needs to be audited, in particular for secure applications where the size of a software bill of materials may be a concern.

To accomplish these goals, the configuration syntax is based on the Go (golang) language. This allows us to use Go's parser, already part of the standard library, rather than third-party imports. And Go's syntax meets our standard for user-friendliness.

Example Configuration

The supported syntax supports, for example,

local = env {
  port: 8080,
  host: "127.0.0.1",
}

prod = env {
  port: 80,
  host: "0.0.0.0",
}

// environment tells the application which of the envs to use by default.
environment = local

Example Application Code

Gofigure provides a multiplexer, with a simple scheme in which a handler is called for each value in a configuration file.

A handler is called if it is the best match for a "path" in the configuration file. In the example above, "local = env {}" is a fully-qualified path that matchs only the first item, while "env" is a path that matches all the env{...} objects.

mux := gofigure.Mux{
  "env": gofigure.Object(handleEnv),
  // ...
}

Above, "env" is the path to match, HandleEnv is the application-provided handler function, and gofigure.Object instructs gofigure to unmarshal the value as an object. Under the hood, gofigure uses "encoding/json" for decoding into Go structs, and Object, Array, and Scalar tell gofigure what kind of value to expect.

// env is the Go struct to decode into
type env struct {
  Host string
  Port int
}

// handleEnv shows the signature of a handler function for env objects.
func handleEnv(r gofigure.Route, v env) error {...}

For each match in the configuration file, a handler is passed the full route and value. In this example, a route would be ["local", "=", "env", "{}"] and the same handler would be called again with a route starting "prod".