Skip to content

Loads configuration from many sources

License

Notifications You must be signed in to change notification settings

traefik/paerser

Folders and files

NameName
Last commit message
Last commit date
Aug 27, 2024
Aug 27, 2024
Aug 27, 2024
Aug 27, 2024
Feb 13, 2025
Aug 27, 2024
Feb 13, 2025
Aug 27, 2024
Aug 15, 2020
Aug 29, 2024
Jul 16, 2022
Aug 27, 2024
Aug 27, 2024
Aug 27, 2024
Jul 16, 2022

Repository files navigation

Paerser

Package documentation Build Status Go Report Card

Features

Loads configuration from many sources:

  • CLI flags
  • Configuration files in YAML, TOML, JSON format
  • Environment variables

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