flagged

package module
v0.0.0-...-7adc6c8 Latest Latest
Warning

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

Go to latest
Published: Jun 11, 2016 License: MPL-2.0 Imports: 12 Imported by: 5

README

usage:"Declarative flags."

flagged utilizes struct-tags to register flags and positional parameters. If there isn't at least a usage: struct-tag, the element is ignored.

Status

Build Status

Installation

go get -v github.com/Spatially/go-flagged

Documentation

See GoDoc or Go Walker for automatically generated documentation.

usage:

Given a tagged struct:

var setting struct {
	aString string  `usage:"A String."`
	aBool   bool    `usage:"A Bool."`
	aFloat  float64 `usage:"A Float."`
	ints    struct {
		anInt    int    `usage:"An Int."`
		anInt64  int64  `usage:"An Int64."`
		anUint   uint   `usage:"An Uint."`
		anUint64 uint64 `usage:"An Uint64."`
	}
	ignored string
}

Register the flags and view the usage:

flagged.Parse(&setting)
flag.Usage()

Produces:

usage: ex [flags]
flags:
  -a.bool=false: A Bool.
  -a.float=0: A Float.
  -a.string="": A String.
  -ints.an.int=0: An Int.
  -ints.an.int64=0: An Int64.
  -ints.an.uint=0: An Uint.
  -ints.an.uint64=0: An Uint64.

Additional take-aways from the above are:

  1. All flags are converted to lowercase.
  2. Camel-case prepends a . before lowercasing.
  3. Nested stucts prepend the struct name to the flag name.

Continuing ... (each following section below builds upon the prior section.)

value:

It can default the variable explicitly based on the value: struct-tag.

var setting struct {
	aString string  `value:"default string" usage:"A String."`
	aBool   bool    `value:"true" usage:"A Bool."`
	aFloat  float64 `value:"123.456" usage:"A Float."`
	ints    struct {
		anInt    int    `value:"-1" usage:"An Int."`
		anInt64  int64  `value:"-2" usage:"An Int64."`
		anUint   uint   `value:"1" usage:"An Uint."`
		anUint64 uint64 `value:"2" usage:"An Uint64."`
	}
}

Which produces:

usage: ex [flags]
flags:
  -a.bool=true: A Bool.
  -a.float=123.456: A Float.
  -a.string="default string": A String.
  -ints.an.int=-1: An Int.
  -ints.an.int64=-2: An Int64.
  -ints.an.uint=1: An Uint.
  -ints.an.uint64=2: An Uint64.

env:

It can also default the variable from an environment variable based on the env: struct-tag. The environment variable value will override a value:.

var setting struct {
	aString string  `env:"ASTRING" value:"default string" usage:"A String."`
	aBool   bool    `env:"ABOOL" value:"true" usage:"A Bool."`
	aFloat  float64 `env:"AFLOAT" value:"123.456" usage:"A Float."`
	ints    struct {
		anInt    int    `env:"ANINT" value:"-1" usage:"An Int."`
		anInt64  int64  `env:"ANINT64" value:"-2" usage:"An Int64."`
		anUint   uint   `env:"ANUINT" value:"1" usage:"An Uint."`
		anUint64 uint64 `env:"ANUINT64" value:"2" usage:"An Uint64."`
	}
}

Which produces:

usage: ex [flags]
flags:
  -a.bool=true: A Bool. (ABOOL)
  -a.float=123.456: A Float. (AFLOAT)
  -a.string="default string": A String. (ASTRING)
  -ints.an.int=-1: An Int. (ANINT)
  -ints.an.int64=-2: An Int64. (ANINT64)
  -ints.an.uint=1: An Uint. (ANUINT)
  -ints.an.uint64=2: An Uint64. (ANUINT64)

flag:

The flag can be named explicitly using the flag: struct-tag.

Be careful with this. Duplicate registrations causes flag to panic. flagged recovers from the panic and outputs the error but the flag will obviously not be registered.

var setting struct {
	aString string  `flag:"flag.string" env:"ASTRING" value:"default string" usage:"A String."`
	aBool   bool    `flag:"flag.bool" env:"ABOOL" value:"true" usage:"A Bool."`
	aFloat  float64 `flag:"flag.float" env:"AFLOAT" value:"123.456" usage:"A Float."`
	ints    struct {
		anInt    int    `flag:"flag.int" env:"ANINT" value:"-1" usage:"An Int."`
		anInt64  int64  `flag:"flag.int64" env:"ANINT64" value:"-2" usage:"An Int64."`
		anUint   uint   `flag:"flag.uint" env:"ANUINT" value:"1" usage:"An Uint."`
		anUint64 uint64 `flag:"flag.uint64" env:"ANUINT64" value:"2" usage:"An Uint64."`
	}
}

Which produces:

usage: ex [flags]
flags:
  -flag.bool=true: A Bool. (ABOOL)
  -flag.float=123.456: A Float. (AFLOAT)
  -flag.string="default string": A String. (ASTRING)
  -ints.flag.int=-1: An Int. (ANINT)
  -ints.flag.int64=-2: An Int64. (ANINT64)
  -ints.flag.uint=1: An Uint. (ANUINT)
  -ints.flag.uint64=2: An Uint64. (ANUINT64)
flag aliases:

The flag can be a comma-delimited list of flag names. Using _ will include the standard struct-derived named as a flag.

var setting struct {
	aliased struct {
		x int `flag:"i,_" env:"ALIASED" value:"123" usage:"An Int."`
		y int `flag:"yy" env:"ALIASED" value:"345" usage:"An Int."`
		z int `flag:"_,a" env:"ALIASED" value:"567" usage:"An Int."`
	}
}

Which produces:

usage: ex [flags]
flags:
	-a=567: alias for -aliased.z: An Int. (ALIASED)
	-aliased.x=123: alias for -i: An Int. (ALIASED)
	-aliased.z=567: An Int. (ALIASED)
	-i=123: An Int. (ALIASED)
	-yy=345: An Int. (ALIASED)

positional:

var setting struct {
	_positional struct {
		first  string  `usage:"Just the first"`
		second int     `usage:"Just the second"`
		third  float64 `usage:"Just the third" value:"3.0"`
		fourth uint64  `usage:"Just the fourth" value:"4"`
		fifth  int64   `usage:"Just the fifth"`
		sixth  string  `usage:"Just the sixth" value:"sixth"`
	}
}

Which produces:

usage: ex [flags] first second [third [fourth [fifth [sixth]]]]
positional:
  first (string) - Just the first
  second (int) - Just the second
  third=3.0 (float64) - Just the third
  fourth=4 (uint64) - Just the fourth
  fifth=0 (int64) - Just the fifth
  sixth="sixth" (string) - Just the sixth

Note: All positional arguments including and after the first with a value: tag are optional arguments.

Documentation

Overview

`flagged` utilizes struct-tags to register flags. It can default the variable explicitly based on the `value:` struct-tag as well as from an environment variable based on the `env:` struct-tag. If there isn't at least a `usage:` struct-tag, the element is ignored. The flag can be named explicitly using the `flag:` struct-tag.

Index

Constants

View Source
const (
	// Pass flagged.Continue to flagged.Parse functions if you want to register different structs.
	// Not passing Continue will cause the flagged.Parse functions to call flag.Parse, meaning that
	// any subsequent calls to flagged.Parse will not have any impact.
	Continue options = iota
)

Variables

View Source
var (
	// Show some detailed output about the registered flags.
	FlaggedDebugging = false
	// A global prefix.
	Prefix = ""
	// The separator to use.
	Separator = "."
)
View Source
var (
	Usage = usage()
)

Functions

func Parse

func Parse(value_ interface{}, options_ ...options)

Pass a pointer to the flagged-tagged struct and Parse will register all the flags. Given a tagged struct:

var setting struct {
	aString string  `usage:"A String."`
}

Register the flags and view the usage:

flagged.Parse(&setting)

func ParseWithPrefix

func ParseWithPrefix(value_ interface{}, prefix string, options_ ...options)

Pass a pointer to the flagged-tagged struct and a prefix string and ParseWithPrefix will register all the flags prefixed with `prefix`.

func Program

func Program() (string, string)

Returns the executable's basename and absolute path.

Types

This section is empty.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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