~fancycade/gourd

A familiar config library for Erlang applications
Update README
Prepare for release
Update type specs and pass dialyzer scan

clone

read-only
https://git.sr.ht/~fancycade/gourd
read/write
git@git.sr.ht:~fancycade/gourd

You can also use your local clone with git send-email.

#gourd

An accessible config library for Erlang applications.

#Build

rebar3 compile

#Usage

Add gourd to your rebar.config:

{deps, [gourd]}.

Load the config at application startup.

-module(example_app).
-behaviour(application).
-export([start/2, stop/1]).

start(_StartType, _StartArgs) ->
    gourd:load(),
    example_sup:start_link().

stop(_State) ->
    ok.

By default gourd:load will load gourd.toml from the application's private directory and set config values for the calling application.

If the above example loaded a gourd.toml like this:

hello = "world"

The config value of hello would be accessible like this:

{ok, Hello} = application:get_env(example, hello).
Hello == <<"world">>

The first set of keys in the TOML file are converted to atoms.

#Customize Loading

If gourd's default's don't suit you. The gourd library supports load/1 and load/2.

Specify the application you want priv/gourd.toml to apply to:

gourd:load(example).

To specify the application and the path to load the config file from:

gourd:load(example, "priv/other_gourd.toml")

OR outside of the priv dir:

gourd:load(example, "config.toml")

#Environment Variables

It is common to need to load a environment variables at the start of your application.

This feature is supported in gourd by parsing special values in strings and replacing them with their corresponding environment variables.

Assuming these environment variables are present in the running process:

export WORLD="world"
export ENV="prod"
export AWS_REGION="us-east-1"

We can load these as part of the config with a TOML file like this:

hello = "${WORLD}"
env = "${ENV}"
aws_region = "${AWS_REGION}"

This would result in a config that looked like this:

#{hello => <<"world">>,
  env => <<"prod">>,
  aws_region => <<"us-east-1">>}

Special values can even be parsed in the middle of a string:

bucket = "example-${ENV}-${AWS_REGION}"

Would return a config like this:

#{bucket => <<"example-prod-us-east-1">>}

String replacing even works in nested data structures. With the exception that map keys are not replaced.

A toml file like this:

list_values = ["hello", "${WORLD}"]

[map_values]
key1 = "stuff"
key2 = "${ENV}stuff"

Would return a config like this:

#{list_values => [<<"hello">>, <<"world">>],
  map_values => #{<<"key1">> => <<"stuff">>,
                  <<"key2">> => <<"prodstuff">>}}