Merge pull request #83 from alexflint/tweak-examples

Add expected outputs to all runnable examples
This commit is contained in:
Alex Flint 2019-05-03 13:14:44 -07:00 committed by GitHub
commit 6de9e789a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 24 deletions

View File

@ -3,12 +3,17 @@ package arg
import ( import (
"fmt" "fmt"
"os" "os"
"strings"
) )
func split(s string) []string {
return strings.Split(s, " ")
}
// This example demonstrates basic usage // This example demonstrates basic usage
func Example() { func Example() {
// These are the args you would pass in on the command line // These are the args you would pass in on the command line
os.Args = []string{"./example", "--foo=hello", "--bar"} os.Args = split("./example --foo=hello --bar")
var args struct { var args struct {
Foo string Foo string
@ -16,65 +21,72 @@ func Example() {
} }
MustParse(&args) MustParse(&args)
fmt.Println(args.Foo, args.Bar) fmt.Println(args.Foo, args.Bar)
// output: hello true
} }
// This example demonstrates arguments that have default values // This example demonstrates arguments that have default values
func Example_defaultValues() { func Example_defaultValues() {
// These are the args you would pass in on the command line // These are the args you would pass in on the command line
os.Args = []string{"--help"} os.Args = split("./example")
var args struct { var args struct {
Foo string Foo string
Bar bool
} }
args.Foo = "default value" args.Foo = "default value"
MustParse(&args) MustParse(&args)
fmt.Println(args.Foo, args.Bar) fmt.Println(args.Foo)
// output: default value
} }
// This example demonstrates arguments that are required // This example demonstrates arguments that are required
func Example_requiredArguments() { func Example_requiredArguments() {
// These are the args you would pass in on the command line // These are the args you would pass in on the command line
os.Args = []string{"--foo=1", "--bar"} os.Args = split("./example --foo=abc --bar")
var args struct { var args struct {
Foo string `arg:"required"` Foo string `arg:"required"`
Bar bool Bar bool
} }
MustParse(&args) MustParse(&args)
fmt.Println(args.Foo, args.Bar)
// output: abc true
} }
// This example demonstrates positional arguments // This example demonstrates positional arguments
func Example_positionalArguments() { func Example_positionalArguments() {
// These are the args you would pass in on the command line // These are the args you would pass in on the command line
os.Args = []string{"./example", "in", "out1", "out2", "out3"} os.Args = split("./example in out1 out2 out3")
var args struct { var args struct {
Input string `arg:"positional"` Input string `arg:"positional"`
Output []string `arg:"positional"` Output []string `arg:"positional"`
} }
MustParse(&args) MustParse(&args)
fmt.Println("Input:", args.Input) fmt.Println("In:", args.Input)
fmt.Println("Output:", args.Output) fmt.Println("Out:", args.Output)
// output:
// In: in
// Out: [out1 out2 out3]
} }
// This example demonstrates arguments that have multiple values // This example demonstrates arguments that have multiple values
func Example_multipleValues() { func Example_multipleValues() {
// The args you would pass in on the command line // The args you would pass in on the command line
os.Args = []string{"--help"} os.Args = split("./example --database localhost --ids 1 2 3")
var args struct { var args struct {
Database string Database string
IDs []int64 IDs []int64
} }
MustParse(&args) MustParse(&args)
fmt.Printf("Fetching the following IDs from %s: %q", args.Database, args.IDs) fmt.Printf("Fetching the following IDs from %s: %v", args.Database, args.IDs)
// output: Fetching the following IDs from localhost: [1 2 3]
} }
// This eample demonstrates multiple value arguments that can be mixed with // This eample demonstrates multiple value arguments that can be mixed with
// other arguments. // other arguments.
func Example_multipleMixed() { func Example_multipleMixed() {
os.Args = []string{"./example", "-c", "cmd1", "db1", "-f", "file1", "db2", "-c", "cmd2", "-f", "file2", "-f", "file3", "db3", "-c", "cmd3"} os.Args = split("./example -c cmd1 db1 -f file1 db2 -c cmd2 -f file2 -f file3 db3 -c cmd3")
var args struct { var args struct {
Commands []string `arg:"-c,separate"` Commands []string `arg:"-c,separate"`
Files []string `arg:"-f,separate"` Files []string `arg:"-f,separate"`
@ -82,21 +94,44 @@ func Example_multipleMixed() {
} }
MustParse(&args) MustParse(&args)
fmt.Println("Commands:", args.Commands) fmt.Println("Commands:", args.Commands)
fmt.Println("Files", args.Files) fmt.Println("Files:", args.Files)
fmt.Println("Databases", args.Databases) fmt.Println("Databases:", args.Databases)
// output:
// Commands: [cmd1 cmd2 cmd3]
// Files: [file1 file2 file3]
// Databases: [db1 db2 db3]
} }
// This example shows the usage string generated by go-arg // This example shows the usage string generated by go-arg
func Example_usageString() { func Example_usageString() {
// These are the args you would pass in on the command line // These are the args you would pass in on the command line
os.Args = []string{"--help"} os.Args = split("./example --help")
var args struct { var args struct {
Input string `arg:"positional"` Input string `arg:"positional"`
Output []string `arg:"positional"` Output []string `arg:"positional"`
Verbose bool `arg:"-v,help:verbosity level"` Verbose bool `arg:"-v" help:"verbosity level"`
Dataset string `arg:"help:dataset to use"` Dataset string `help:"dataset to use"`
Optimize int `arg:"-O,help:optimization level"` Optimize int `arg:"-O,help:optimization level"`
} }
// This is only necessary when running inside golang's runnable example harness
osExit = func(int) {}
MustParse(&args) MustParse(&args)
// output:
// Usage: example [--verbose] [--dataset DATASET] [--optimize OPTIMIZE] INPUT [OUTPUT [OUTPUT ...]]
//
// Positional arguments:
// INPUT
// OUTPUT
//
// Options:
// --verbose, -v verbosity level
// --dataset DATASET dataset to use
// --optimize OPTIMIZE, -O OPTIMIZE
// optimization level
// --help, -h display this help and exit
} }

View File

@ -13,6 +13,9 @@ import (
scalar "github.com/alexflint/go-scalar" scalar "github.com/alexflint/go-scalar"
) )
// to enable monkey-patching during tests
var osExit = os.Exit
// spec represents a command line option // spec represents a command line option
type spec struct { type spec struct {
dest reflect.Value dest reflect.Value
@ -38,20 +41,21 @@ func MustParse(dest ...interface{}) *Parser {
p, err := NewParser(Config{}, dest...) p, err := NewParser(Config{}, dest...)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
os.Exit(-1) osExit(-1)
} }
err = p.Parse(flags()) err = p.Parse(flags())
if err == ErrHelp { switch {
case err == ErrHelp:
p.WriteHelp(os.Stdout) p.WriteHelp(os.Stdout)
os.Exit(0) osExit(0)
} case err == ErrVersion:
if err == ErrVersion {
fmt.Println(p.version) fmt.Println(p.version)
os.Exit(0) osExit(0)
} case err != nil:
if err != nil {
p.Fail(err.Error()) p.Fail(err.Error())
} }
return p return p
} }