confinator

package module
v1.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 6, 2022 License: MIT Imports: 12 Imported by: 0

README

go-confinator

Flag var parsing helpers

.github/workflows/tests.yaml

BuildInfo

Build info is a single portable type designed to house and carry "version" information about your program.

Example:

Code:

package main

import (
	"fmt"
	"github.com/dcarbone/go-confinator"
)

var (
	BuildName   string
	BuildDate   string
	BuildBranch string
	BuildNumber string
)

func main() {
	bi := confinator.NewBuildInfo(BuildName, BuildDate, BuildBranch, BuildNumber)
	fmt.Println(bi)
}

Build:

BUILD_NAME="buildinfo"
BUILD_DATE="$(date -u +%Y%m%d@%H%M%S%z)"
BUILD_BRANCH="$(git branch --no-color|awk '/^\*/ {print $2}')"
BUILD_NUMBER="00000"

go build -o="${BUILD_NAME}" -ldflags "\
-X main.BuildName=${BUILD_NAME} \
-X main.BuildDate=${BUILD_DATE} \
-X main.BuildBranch=${BUILD_BRANCH} \
-X main.BuildNumber=${BUILD_NUMBER}"

Show:

./buildinfo
# should print out provided build ldflags.

Confinator

Confinator's main purpose is to make parsing runtime flags into "complex" config types in a flexible and extensible manner.

As an example:

package main

import (
	"fmt"
	"flag"
	"net"
	"net/http"
	"os"
	"github.com/dcarbone/go-confinator"
)

type MyConfig struct {
	IP      net.IP
	Strings []string
	Map     map[string]string
	Header  http.Header
}

func main() {
	cf := confinator.NewConfinator()
	fs := flag.NewFlagSet("confinator-test", flag.PanicOnError)
	conf := MyConfig{
		Strings: make([]string, 0),
		Map: make(map[string]string),
		Header: make(http.Header),
	}
	cf.FlagVar(fs, &conf.IP, "ip", "IP address")
	cf.FlagVar(fs, &conf.Strings, "string", "any string, may be defined multiple times")
	cf.FlagVar(fs, &conf.Map, "map", "arbitrary map value, may be defined multiple times")
	cf.FlagVar(fs, &conf.Header, "header", "HTTP header values")
	_ = fs.Parse(os.Args[1:])
	fmt.Println(conf)
}

Put the above in a file named main.go or whatever you want

go run main.go \
  -ip 10.1.2.3 \
  -string string1 -string string2 \
  -map=key1:value11 -map key1:value12 \
  -map key2: value21 -map=key2:value22 \
  -header 'Authorization:Basic dGhlIGNha2UgaXMgYSBsaWU=' \
  -header 'Authorization:Basic ZG9scGhpbg=='

You should see this printed to stdout:

{10.1.2.3 [string1 string2] map[key1:value12 key2:value22] map[Authorization:[Basic dGhlIGNha2UgaXMgYSBsaWU= Basic ZG9scGhpbg==]]}

Flag Var types

This package comes with a number of built-in types, which you can view here.

Registering new flag var types

Registering new types to use as flags is easy. Create a suitable type that implements the Getter interface, then register it to a constructed Confinator instance using RegisterFlagVarType

You can look at the DefaultFlagVarTypes func to see examples of this.

Documentation

Index

Constants

View Source
const (
	EnvBuildUniqueID = "BUILD_UNIQUE_ID"
)

Variables

This section is empty.

Functions

func DefaultFlagVarTypes

func DefaultFlagVarTypes() map[string]FlagVarTypeHandlerFunc

DefaultFlagVarTypes returns a list of

func FlagHelpText

func FlagHelpText(conf FlagHelpTextConf) string

Types

type BuildInfo

type BuildInfo struct {
	BuildName   string `json:"build_name"`
	BuildDate   string `json:"build_date"`
	BuildBranch string `json:"build_branch"`
	BuildNumber string `json:"build_number"`

	Version     string `json:"version"`
	VersionHash int64  `json:"version_hash"`

	BuildUniqueID string `json:"unique_id"`
}

func NewBuildInfo

func NewBuildInfo(name, date, branch, number string) BuildInfo

type Confinator

type Confinator struct {
	// contains filtered or unexported fields
}

func NewConfinator

func NewConfinator() *Confinator

func (*Confinator) FlagVar

func (cf *Confinator) FlagVar(fs *flag.FlagSet, varPtr interface{}, name, usage string)

FlagVar is a convenience method that handles a few common config struct -> flag cases

func (*Confinator) RegisterFlagVarType

func (cf *Confinator) RegisterFlagVarType(varPtr interface{}, fn FlagVarTypeHandlerFunc)

type FlagHelpFooterFunc

type FlagHelpFooterFunc func(state HelpTextState) string
var DefaultFlagHelpFooterFunc FlagHelpFooterFunc = func(state HelpTextState) string {
	return ""
}

type FlagHelpHeaderFunc

type FlagHelpHeaderFunc func(state HelpTextState) string
var DefaultFlagHelpHeaderFunc FlagHelpHeaderFunc = func(state HelpTextState) string {
	return fmt.Sprintf("%s\n", state.FlagSet.Name())
}

type FlagHelpTableFooterFunc

type FlagHelpTableFooterFunc func(state HelpTextState) string
var DefaultFlagHelpTableFooterFunc FlagHelpTableFooterFunc = func(state HelpTextState) string {
	return ""
}

type FlagHelpTableHeaderFunc

type FlagHelpTableHeaderFunc func(state HelpTextState) string
var DefaultFlagHelpTableHeaderFunc FlagHelpTableHeaderFunc = func(state HelpTextState) string {
	return fmt.Sprintf(
		"\t[Flag]%s[Default]%s[Usage]",
		strings.Repeat(" ", state.LongestName-1),
		strings.Repeat(" ", state.LongestDefault-5),
	)
}

type FlagHelpTableRowFunc

type FlagHelpTableRowFunc func(flagNum int, f *flag.Flag, state HelpTextState) string
var DefaultFlagHelpTableRowFunc FlagHelpTableRowFunc = func(flagNum int, f *flag.Flag, state HelpTextState) string {
	return fmt.Sprintf(
		"\n\t-%s%s%s%s%s",
		f.Name,
		strings.Repeat(" ", state.LongestName-len(f.Name)+4),
		f.DefValue,
		strings.Repeat(" ", state.LongestDefault-len(f.DefValue)+4),
		f.Usage,
	)
}

type FlagHelpTextConf

type FlagHelpTextConf struct {
	FlagSet         *flag.FlagSet
	HeaderFunc      FlagHelpHeaderFunc
	TableHeaderFunc FlagHelpTableHeaderFunc
	TableRowFunc    FlagHelpTableRowFunc
	TableFooterFunc FlagHelpTableFooterFunc
	FooterFunc      FlagHelpFooterFunc
}

type FlagVarTypeHandlerFunc

type FlagVarTypeHandlerFunc func(fs *flag.FlagSet, varPtr interface{}, name, usage string)

type HelpTextState

type HelpTextState struct {
	FlagSet        *flag.FlagSet
	LongestName    int
	LongestDefault int
	Current        string
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL