traefik / paerser

Loads configuration from many sources
Apache License 2.0
54 stars 18 forks source link
cli-flags configuration environment-variables go golang golang-library json toml yaml

Paerser

Package documentation Build Status Go Report Card

Features

Loads configuration from many sources:

It also provides a simple CLI commands handling system.

Examples

Configuration

CLI Flags

package flag_test

import (
    "log"

    "github.com/davecgh/go-spew/spew"
    "github.com/traefik/paerser/flag"
)

type ConfigExample struct {
    Foo   string
    Bar   Bar
    Great bool
}

type Bar struct {
    Sub  *Sub
    List []string
}

type Sub struct {
    Name  string
    Value int
}

func ExampleDecode() {
    args := []string{
        "--foo=aaa",
        "--great=true",
        "--bar.list=AAA,BBB",
        "--bar.sub.name=bbb",
        "--bar.sub.value=6",
    }

    config := ConfigExample{}

    err := flag.Decode(args, &config)
    if err != nil {
        log.Fatal(err)
    }

    spew.Config = spew.ConfigState{
        Indent:                  "\t",
        DisablePointerAddresses: true,
    }
    spew.Dump(config)

    // Output:
    // (flag_test.ConfigExample) {
    //  Foo: (string) (len=3) "aaa",
    //  Bar: (flag_test.Bar) {
    //      Sub: (*flag_test.Sub)({
    //          Name: (string) (len=3) "bbb",
    //          Value: (int) 6
    //      }),
    //      List: ([]string) (len=2 cap=2) {
    //          (string) (len=3) "AAA",
    //          (string) (len=3) "BBB"
    //      }
    //  },
    //  Great: (bool) true
    // }
}

File

package file_test

import (
    "fmt"
    "log"
    "os"

    "github.com/davecgh/go-spew/spew"
    "github.com/traefik/paerser/file"
)

type ConfigExample struct {
    Foo   string
    Bar   Bar
    Great bool
}

type Bar struct {
    Sub  *Sub
    List []string
}

type Sub struct {
    Name  string
    Value int
}

func ExampleDecode() {
    tempFile, err := os.CreateTemp("", "paeser-*.yml")
    if err != nil {
        log.Fatal(err)
    }

    defer func() { _ = os.RemoveAll(tempFile.Name()) }()

    data := `
foo: aaa
bar:
  sub:
    name: bbb
    value: 6
  list:
  - AAA
  - BBB
great: true
`

    _, err = fmt.Fprint(tempFile, data)
    if err != nil {
        log.Fatal(err)
    }

    // Read configuration file

    filePath := tempFile.Name()

    config := ConfigExample{}

    err = file.Decode(filePath, &config)
    if err != nil {
        log.Fatal(err)
    }

    spew.Config = spew.ConfigState{
        Indent:                  "\t",
        DisablePointerAddresses: true,
    }
    spew.Dump(config)

    // Output:
    // (file_test.ConfigExample) {
    //  Foo: (string) (len=3) "aaa",
    //  Bar: (file_test.Bar) {
    //      Sub: (*file_test.Sub)({
    //          Name: (string) (len=3) "bbb",
    //          Value: (int) 6
    //      }),
    //      List: ([]string) (len=2 cap=2) {
    //          (string) (len=3) "AAA",
    //          (string) (len=3) "BBB"
    //      }
    //  },
    //  Great: (bool) true
    // }
}

Environment Variables

package env_test

import (
    "log"
    "os"

    "github.com/davecgh/go-spew/spew"
    "github.com/traefik/paerser/env"
)

type ConfigExample struct {
    Foo   string
    Bar   Bar
    Great bool
}

type Bar struct {
    Sub  *Sub
    List []string
}

type Sub struct {
    Name  string
    Value int
}

func ExampleDecode() {
    _ = os.Setenv("MYAPP_FOO", "aaa")
    _ = os.Setenv("MYAPP_GREAT", "true")
    _ = os.Setenv("MYAPP_BAR_LIST", "AAA,BBB")
    _ = os.Setenv("MYAPP_BAR_SUB_NAME", "bbb")
    _ = os.Setenv("MYAPP_BAR_SUB_VALUE", "6")

    config := ConfigExample{}

    err := env.Decode(os.Environ(), "MYAPP_", &config)
    if err != nil {
        log.Fatal(err)
    }

    spew.Config = spew.ConfigState{
        Indent:                  "\t",
        DisablePointerAddresses: true,
    }
    spew.Dump(config)

    // Output:
    // (env_test.ConfigExample) {
    //  Foo: (string) (len=3) "aaa",
    //  Bar: (env_test.Bar) {
    //      Sub: (*env_test.Sub)({
    //          Name: (string) (len=3) "bbb",
    //          Value: (int) 6
    //      }),
    //      List: ([]string) (len=2 cap=2) {
    //          (string) (len=3) "AAA",
    //          (string) (len=3) "BBB"
    //      }
    //  },
    //  Great: (bool) true
    // }
}

CLI Commands

TODO