Skip to content

Commit 6376053

Browse files
committed
Updated
1 parent 2bfcb78 commit 6376053

File tree

4 files changed

+84
-38
lines changed

4 files changed

+84
-38
lines changed

cmd/api/cmd.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

33
import (
4+
"fmt"
5+
46
"github.com/djthorpe/go-tablewriter"
57
"github.com/mutablelogic/go-client"
68
)
@@ -24,11 +26,19 @@ type Fn struct {
2426
///////////////////////////////////////////////////////////////////////////////
2527
// PUBLIC METHODS
2628

27-
func (c *Cmd) Get(match string) *Fn {
28-
for _, fn := range c.Fn {
29-
if fn.Name == match {
30-
return &fn
31-
}
29+
func (c *Cmd) Get(args []string) *Fn {
30+
if len(args) == 0 {
31+
return nil
3232
}
33+
fmt.Println("TODO: %q", args)
3334
return nil
35+
/*
36+
for _, fn := range c.Fn {
37+
if fn.Name == match {
38+
return &fn
39+
}
40+
}
41+
42+
return nil
43+
*/
3444
}

cmd/api/flags.go

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func NewFlags(name string) *Flags {
4949
flags := new(Flags)
5050
flags.FlagSet = flag.NewFlagSet(name, flag.ContinueOnError)
5151
flags.names = make(map[string]*Value)
52-
flags.FlagSet.Usage = flags.PrintUsage
52+
flags.FlagSet.Usage = func() {}
5353

5454
// Register global flags
5555
flags.Bool("", "debug", false, "Enable debug logging")
@@ -70,6 +70,9 @@ func (flags *Flags) Register(c Cmd) {
7070
func (flags *Flags) Parse(args []string) error {
7171
// Parse command line
7272
if err := flags.FlagSet.Parse(args); err != nil {
73+
if err == flag.ErrHelp {
74+
flags.PrintUsage()
75+
}
7376
return err
7477
}
7578

@@ -82,22 +85,24 @@ func (flags *Flags) Parse(args []string) error {
8285
// Set client options
8386
opts := []client.ClientOpt{}
8487
if flags.GetBool("debug") {
85-
verbose := flags.GetBool("verbose")
86-
opts = append(opts, client.OptTrace(flags.Output(), verbose))
88+
// Append debug option with optional verbose
89+
opts = append(opts, client.OptTrace(flags.Output(), flags.GetBool("verbose")))
8790
}
8891

8992
// Parse the commands
9093
for _, cmd := range flags.cmds {
91-
cmd.Parse(flags, opts...)
94+
if err := cmd.Parse(flags, opts...); err != nil {
95+
return fmt.Errorf("%v: %w", cmd.Name, err)
96+
}
9297
}
9398

9499
// Return success
95100
return nil
96101
}
97102

98-
// GetCommand returns a command set from a name, or nil if the command set does
103+
// GetCommandSet returns a command set from a name, or nil if the command set does
99104
// not exist
100-
func (flags *Flags) GetCommand(name string) *Cmd {
105+
func (flags *Flags) GetCommandSet(name string) *Cmd {
101106
for _, cmd := range flags.cmds {
102107
if cmd.Name == name {
103108
return &cmd
@@ -149,38 +154,65 @@ func (flags *Flags) PrintVersion() {
149154
func (flags *Flags) PrintUsage() {
150155
w := flags.Output()
151156
if flags.NArg() == 1 {
152-
cmd := flags.GetCommand(flags.Arg(0))
153-
if cmd == nil {
154-
fmt.Fprintf(w, "Unknown command: %q\n", flags.Arg(0))
155-
return
157+
cmd := flags.GetCommandSet(flags.Arg(0))
158+
if cmd != nil {
159+
flags.PrintCommandUsage(cmd)
156160
}
157-
fmt.Fprintln(w, flags.Name(), cmd.Name)
158-
fmt.Fprintln(w, " ", cmd.Description)
159-
fmt.Fprintln(w, "")
160-
flags.PrintCommandFlags(cmd.Name)
161161
} else {
162-
fmt.Fprintln(w, flags.Name())
162+
fmt.Fprintln(w, "Name:", flags.Name())
163163
fmt.Fprintln(w, " General command-line interface to API clients")
164164
fmt.Fprintln(w, "")
165-
fmt.Fprintln(w, "Syntax:")
165+
166+
// Command Sets
167+
fmt.Fprintln(w, "Command Sets:")
168+
for _, cmd := range flags.cmds {
169+
fmt.Fprintln(w, " ", flags.Name(), cmd.Name)
170+
fmt.Fprintln(w, " ", cmd.Description)
171+
fmt.Fprintln(w, "")
172+
}
173+
174+
// Help
175+
fmt.Fprintln(w, "Help:")
166176
fmt.Fprintln(w, " ", flags.Name(), "version")
167177
fmt.Fprintln(w, " ", "Return the version of the application")
168178
fmt.Fprintln(w, "")
179+
180+
// Help for command sets
169181
for _, cmd := range flags.cmds {
170182
fmt.Fprintln(w, " ", flags.Name(), "-help", cmd.Name)
171183
fmt.Fprintln(w, " ", "Display", cmd.Name, "command syntax")
172184
fmt.Fprintln(w, "")
173185
}
186+
187+
fmt.Fprintln(w, "")
188+
flags.PrintGlobalFlags()
174189
}
175-
fmt.Fprintln(w, "")
176-
flags.PrintGlobalFlags()
177190
}
178191

179192
// PrintGlobalFlags prints out the global flags
180193
func (flags *Flags) PrintGlobalFlags() {
181194
flags.PrintCommandFlags("")
182195
}
183196

197+
// PrintCommandUsage prints the usage of a commandset
198+
func (flags *Flags) PrintCommandUsage(cmd *Cmd) {
199+
w := flags.Output()
200+
fmt.Fprintln(w, "Name:", flags.Name(), cmd.Name)
201+
fmt.Fprintln(w, " ", cmd.Description)
202+
fmt.Fprintln(w, "")
203+
204+
// Help for command sets
205+
fmt.Fprintln(w, "Commands:")
206+
for _, fn := range cmd.Fn {
207+
fmt.Fprintln(w, " ", flags.Name(), cmd.Name, fn.Name)
208+
fmt.Fprintln(w, " ", fn.Description)
209+
fmt.Fprintln(w, "")
210+
}
211+
flags.PrintCommandFlags(cmd.Name)
212+
fmt.Fprintln(w, "")
213+
flags.PrintGlobalFlags()
214+
}
215+
184216
// PrintGlobalFlags prints out the global flags
185217
func (flags *Flags) PrintCommandFlags(cmd string) {
186218
w := flags.Output()

cmd/api/ipify.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func ipifyRegister(flags *Flags) {
1717
Parse: ipifyParse,
1818
Fn: []Fn{
1919
// Default caller
20-
{Call: ipifyGetAddress},
20+
{Call: ipifyGetAddress, Description: "Get the public IP address"},
2121
},
2222
})
2323
}

cmd/api/main.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"os"
77
"path"
8-
"strings"
98

109
"github.com/djthorpe/go-tablewriter"
1110
)
@@ -22,33 +21,38 @@ func main() {
2221
if err := flags.Parse(os.Args[1:]); errors.Is(err, ErrHelp) {
2322
os.Exit(0)
2423
} else if err != nil {
25-
fmt.Fprintln(os.Stderr, err)
2624
os.Exit(-1)
2725
}
2826

2927
// If there are no arguments, print help
3028
if flags.NArg() == 0 {
31-
flags.Usage()
29+
flags.PrintUsage()
3230
os.Exit(-1)
3331
}
3432

35-
// Get command
36-
cmd := flags.GetCommand(flags.Arg(0))
37-
match := strings.Join(flags.Args()[1:], " ")
33+
// Get command set
34+
cmd := flags.GetCommandSet(flags.Arg(0))
3835
if cmd == nil {
3936
fmt.Fprintf(os.Stderr, "Unknown command: %q\n", flags.Arg(0))
4037
os.Exit(-1)
4138
}
42-
fn := cmd.Get(match)
43-
if fn == nil {
44-
fmt.Fprintf(os.Stderr, "Unknown command: %q\n", strings.TrimSpace(strings.Join([]string{flags.Name(), cmd.Name, match}, " ")))
39+
40+
fn := cmd.Get(flags.Args()[1:])
41+
if fn != nil {
42+
if err := Run(fn); err != nil {
43+
fmt.Fprintln(os.Stderr, err)
44+
os.Exit(-2)
45+
}
46+
}
47+
if flags.NArg() == 1 {
48+
flags.PrintCommandUsage(cmd)
49+
} else {
50+
fmt.Fprintf(os.Stderr, "Unknown command: %q\n", flags.Args()[1:])
4551
os.Exit(-1)
4652
}
53+
}
4754

48-
// Create a tablewriter
55+
func Run(fn *Fn) error {
4956
writer := tablewriter.New(os.Stdout, tablewriter.OptOutputText(), tablewriter.OptHeader())
50-
if err := fn.Call(writer); err != nil {
51-
fmt.Fprintln(os.Stderr, err)
52-
os.Exit(-2)
53-
}
57+
return fn.Call(writer)
5458
}

0 commit comments

Comments
 (0)