Coder Social home page Coder Social logo

sflags's Introduction

Flags based on structures. GoDoc Build Status codecov Go Report Card

The sflags package uses structs, reflection and struct field tags to allow you specify command line options. It supports different types and features.

An example:

type HTTPConfig struct {
	Host    string        `desc:"HTTP host"`
	Port    int           `flag:"port p" desc:"some port"`
	SSL     bool          `env:"HTTP_SSL_VALUE"`
	Timeout time.Duration `flag:",deprecated,hidden"`
}

type Config struct {
	HTTP  HTTPConfig
	Stats StatsConfig
}

And you can use your favorite flag or cli library!

Supported flags and cli libraries:

Features:

  • Set environment name
  • Set usage
  • Long and short forms
  • Skip field
  • Required
  • Placeholders (by name)
  • Deprecated and hidden options
  • Multiple ENV names
  • Interface for user types.
  • Validation (using govalidator package)
  • Anonymous nested structure support (anonymous structures flatten by default)

Supported types in structures:

  • int, int8, int16, int32, int64
  • uint, uint8, uint16, uint32, uint64
  • float32, float64
  • slices for all previous numeric types (e.g. []int, []float64)
  • bool
  • []bool
  • string
  • []string
  • nested structures
  • net.TCPAddr
  • net.IP
  • time.Duration
  • regexp.Regexp
  • map for all previous types (e.g. map[int64]bool, map[string]float64)

Custom types:

  • HexBytes

  • count

  • ipmask

  • enum values

  • enum list values

  • file

  • file list

  • url

  • url list

  • units (bytes 1kb = 1024b, speed, etc)

Supported features matrix:

Name Hidden Deprecated Short Env
flag - - - -
pflag [x] [x] [x] -
kingpin [x] [ ] [x] [x]
urfave [x] - [x] [x]
cobra [x] [x] [x] -
viper [ ] [ ] [ ] [ ]

[x] - feature is supported and implemented

- - feature can't be implemented for this cli library

Simple example for flag library:

package main

import (
	"flag"
	"log"
	"time"

	"github.com/octago/sflags/gen/gflag"
)

type httpConfig struct {
	Host    string `desc:"HTTP host"`
	Port    int
	SSL     bool
	Timeout time.Duration
}

type config struct {
	HTTP httpConfig
}

func main() {
	cfg := &config{
		HTTP: httpConfig{
			Host:    "127.0.0.1",
			Port:    6000,
			SSL:     false,
			Timeout: 15 * time.Second,
		},
	}
	err := gflag.ParseToDef(cfg)
	if err != nil {
		log.Fatalf("err: %v", err)
	}
	flag.Parse()
}

That code generates next output:

go run ./main.go --help
Usage of _obj/exe/main:
  -http-host value
    	HTTP host (default 127.0.0.1)
  -http-port value
    	 (default 6000)
  -http-ssl

  -http-timeout value
    	 (default 15s)
exit status 2

Look at the other examples for different flag libraries.

Options for flag tag

The flag default key string is the struct field name but can be specified in the struct field's tag value. The "flag" key in the struct field's tag value is the key name, followed by an optional comma and options. Examples:

// Field is ignored by this package.
Field int `flag:"-"`

// Field appears in flags as "myName".
Field int `flag:"myName"`

// If this field is from nested struct, prefix from parent struct will be ingored.
Field int `flag:"~myName"`

// You can set short name for flags by providing it's value after a space
// Prefixes will not be applied for short names.
Field int `flag:"myName a"`

// this field will be removed from generated help text.
Field int `flag:",hidden"`

// this field will be marked as deprecated in generated help text
Field int `flag:",deprecated"`

Options for desc tag

If you specify description in description tag (desc by default) it will be used in USAGE section.

Addr string `desc:"HTTP host"`

this description produces something like:

  -addr value
    	HTTP host (default 127.0.0.1)

Options for env tag

Options for Parse function:

// DescTag sets custom description tag. It is "desc" by default.
func DescTag(val string)

// FlagTag sets custom flag tag. It is "flag" be default.
func FlagTag(val string)

// Prefix sets prefix that will be applied for all flags (if they are not marked as ~).
func Prefix(val string)

// EnvPrefix sets prefix that will be applied for all environment variables (if they are not marked as ~).
func EnvPrefix(val string)

// FlagDivider sets custom divider for flags. It is dash by default. e.g. "flag-name".
func FlagDivider(val string)

// EnvDivider sets custom divider for environment variables.
// It is underscore by default. e.g. "ENV_NAME".
func EnvDivider(val string)

// Validator sets validator function for flags.
// Check existed validators in sflags/validator package.
func Validator(val ValidateFunc)

// Set to false if you don't want anonymous structure fields to be flatten.
func Flatten(val bool)

Known issues

  • kingpin doesn't pass value for boolean arguments. Counter can't get initial value from arguments.

Similar projects

sflags's People

Contributors

aleksi avatar anacrolix avatar dolmen avatar furdarius avatar khamliuk avatar m0sth8 avatar vehsamrak avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sflags's Issues

Add support for cobra

Cobra is already supported by pflags, but some things, like environment variables, might be implemented only for cobra.

ast flagset parser to generate sflags structs

Hi,

Hope you are all well !

I am using amalgomate, a go tool for combining multiple different main packages into a single program or library, and I would like to export flags from repacked packages and wrap them with your package, so I can get more details info while printing the help of the repacked package. (Feature actually missing in the current amalgomate version)

Is there a tool allowing to convert a flagset from a package by parsing the ast in order to insert a sflags structs and import your package ?

It could be done here:
https://github.com/palantir/amalgomate/blob/master/amalgomate/astfuncs.go#L121-L133

Thanks for any insights.

Cheers,
Rosco

go mod path

module declares its path as: github.com/sflags
but was required as: github.com/octago/sflags

go mod tidy fails

Suggestion: there should be separate dividers for hierarchies and multi-word options within the same hierarchy

For example

type Multi struct {
	Word Word
}

type Word struct {
	String string
}

type Config struct {
	Multi     *Multi
	MultiWord *Word
}

This sort of config results in both of those options being turned into the flag multi-word-string . This causes some issues when sflags is used in combination with config file parsing libraries because it's impossible to automatically determine if multi-word-string is multi.word.string or multi-word.string.

Multiple build issues

I'm trying to build fdbe18c before starting to contribute, but:

1. make fails

$ make
Go generate
Formatting
Run vet
Run lint
Run metalinter
parser_test.go:28:3:warning: field name6 is unused (U1000) (megacheck)
make: *** [check] Error 1

I'm using the latest gometalinter and I have ensured that the linters are up-to-date (gometalinter -i -u)

2. go test fails

--- FAIL: TestValidator (0.00s)
        Error Trace:    parser_test.go:414
	Error:      	Invalid operation: (sflags.ValidateFunc)(nil) == (sflags.ValidateFunc)(nil) (cannot take func type as argument)
	Test:       	TestValidator
FAIL
exit status 1
FAIL	github.com/octago/sflags	0.025s

I'm using the latest version of the assert package: go get -u github.com/stretchr/testify/assert

New project heavily piggy-backing on your repository

Hello !
I'm posting a little message to "advertise" a project I've been working for a long time now, which is a merging of your own work and the concepts of https://github.com/jessevdk/go-flags, which brings a new array of possiblities and functionality to generated CLI tools.
Since your project was an immense help, because it helped me shifting my approach when working on go-flags, and that most of your code is still used in this new library, I wanted to make a heads-up here !
Link to the repo: https://github.com/reeflective/flags

Hope you will find it useful !

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.