summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example_test.go67
-rw-r--r--parse.go20
2 files changed, 63 insertions, 24 deletions
diff --git a/example_test.go b/example_test.go
index c34effa..72807a7 100644
--- a/example_test.go
+++ b/example_test.go
@@ -3,12 +3,17 @@ package arg
import (
"fmt"
"os"
+ "strings"
)
+func split(s string) []string {
+ return strings.Split(s, " ")
+}
+
// This example demonstrates basic usage
func Example() {
// 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 {
Foo string
@@ -16,65 +21,72 @@ func Example() {
}
MustParse(&args)
fmt.Println(args.Foo, args.Bar)
+ // output: hello true
}
// This example demonstrates arguments that have default values
func Example_defaultValues() {
// These are the args you would pass in on the command line
- os.Args = []string{"--help"}
+ os.Args = split("./example")
var args struct {
Foo string
- Bar bool
}
args.Foo = "default value"
MustParse(&args)
- fmt.Println(args.Foo, args.Bar)
+ fmt.Println(args.Foo)
+ // output: default value
}
// This example demonstrates arguments that are required
func Example_requiredArguments() {
// 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 {
Foo string `arg:"required"`
Bar bool
}
MustParse(&args)
+ fmt.Println(args.Foo, args.Bar)
+ // output: abc true
}
// This example demonstrates positional arguments
func Example_positionalArguments() {
// 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 {
Input string `arg:"positional"`
Output []string `arg:"positional"`
}
MustParse(&args)
- fmt.Println("Input:", args.Input)
- fmt.Println("Output:", args.Output)
+ fmt.Println("In:", args.Input)
+ fmt.Println("Out:", args.Output)
+ // output:
+ // In: in
+ // Out: [out1 out2 out3]
}
// This example demonstrates arguments that have multiple values
func Example_multipleValues() {
// 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 {
Database string
IDs []int64
}
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
// other arguments.
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 {
Commands []string `arg:"-c,separate"`
Files []string `arg:"-f,separate"`
@@ -82,21 +94,44 @@ func Example_multipleMixed() {
}
MustParse(&args)
fmt.Println("Commands:", args.Commands)
- fmt.Println("Files", args.Files)
- fmt.Println("Databases", args.Databases)
+ fmt.Println("Files:", args.Files)
+ 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
func Example_usageString() {
// These are the args you would pass in on the command line
- os.Args = []string{"--help"}
+ os.Args = split("./example --help")
var args struct {
Input string `arg:"positional"`
Output []string `arg:"positional"`
- Verbose bool `arg:"-v,help:verbosity level"`
- Dataset string `arg:"help:dataset to use"`
+ Verbose bool `arg:"-v" help:"verbosity level"`
+ Dataset string `help:"dataset to use"`
Optimize int `arg:"-O,help:optimization level"`
}
+
+ // This is only necessary when running inside golang's runnable example harness
+ osExit = func(int) {}
+
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
}
diff --git a/parse.go b/parse.go
index d4a6334..d06b299 100644
--- a/parse.go
+++ b/parse.go
@@ -12,6 +12,9 @@ import (
scalar "github.com/alexflint/go-scalar"
)
+// to enable monkey-patching during tests
+var osExit = os.Exit
+
// path represents a sequence of steps to find the output location for an
// argument or subcommand in the final destination struct
type path struct {
@@ -72,20 +75,21 @@ func MustParse(dest ...interface{}) *Parser {
p, err := NewParser(Config{}, dest...)
if err != nil {
fmt.Println(err)
- os.Exit(-1)
+ osExit(-1)
}
+
err = p.Parse(flags())
- if err == ErrHelp {
+ switch {
+ case err == ErrHelp:
p.WriteHelp(os.Stdout)
- os.Exit(0)
- }
- if err == ErrVersion {
+ osExit(0)
+ case err == ErrVersion:
fmt.Println(p.version)
- os.Exit(0)
- }
- if err != nil {
+ osExit(0)
+ case err != nil:
p.Fail(err.Error())
}
+
return p
}