# Env Source

The env source reads config from environment variables

## Format

We expect environment variables to be in the standard format of FOO=bar

Keys are converted to lowercase and split on underscore.

### Format example

```bash
DATABASE_ADDRESS=127.0.0.1
DATABASE_PORT=3306
```

Becomes

```json
{
  "database": {
    "address": "127.0.0.1",
    "port": 3306
  }
}
```

## Prefixes

Environment variables can be namespaced so we only have access to a subset. Two options are available:

```go
WithPrefix(p ...string)
WithStrippedPrefix(p ...string)
```

The former will preserve the prefix and make it a top level key in the config. The latter eliminates the prefix, reducing the nesting by one.

### Prefixes example

Given ENVs of:

```bash
APP_DATABASE_ADDRESS=127.0.0.1
APP_DATABASE_PORT=3306
VAULT_ADDR=vault:1337
```

and a source initialized as follows:

```go
src := env.NewSource(
    env.WithPrefix("VAULT"),
    env.WithStrippedPrefix("APP"),
)
```

The resulting config will be:

```json
{
  "database": {
    "address": "127.0.0.1",
    "port": 3306
  },
  "vault": {
    "addr": "vault:1337"
  }
}
```

## New Source

Specify source with data

```go
src := env.NewSource(
  // optionally specify prefix
  env.WithPrefix("MICRO"),
)
```

## Load Source

Load the source into config

```go
// Create new config
conf := config.NewConfig()

// Load env source
conf.Load(src)
```
