Skip to content
Snippets Groups Projects
Verified Commit 4d3fd0f0 authored by Volker Schukai's avatar Volker Schukai :alien:
Browse files

feat new Execute() Method for the automatic execution of command

parent 65f72a7c
No related branches found
No related tags found
No related merge requests found
...@@ -6,10 +6,52 @@ package xflags ...@@ -6,10 +6,52 @@ package xflags
import ( import (
"bytes" "bytes"
"flag" "flag"
"fmt"
"io" "io"
"os"
"reflect" "reflect"
) )
// Execute executes the command line arguments and calls the functions.
func Execute[C any, D any](cmd C, cnf D) *Settings[C] {
return execute(cmd, cnf, os.Args[0], os.Args[1:])
}
func (s *Settings[C]) PrintFlagOutput() {
fmt.Println(s.command.flagSet.Output())
}
// execute is the internal implementation of Execute.
func execute[C any, D any](cmd C, cnf D, name string, args []string) *Settings[C] {
instance := New(name, cmd)
if instance.HasErrors() {
return instance
}
instance.SetShadow(cnf)
if instance.HasErrors() {
return instance
}
instance.Parse(args)
if instance.HelpRequested() {
for i, err := range instance.errors {
if err == flag.ErrHelp {
instance.errors = append(instance.errors[:i], instance.errors[i+1:]...)
}
}
instance.PrintFlagOutput()
return instance
}
if instance.HasErrors() {
return instance
}
instance.Execute()
return instance
}
// New creates a new instance of the settings. // New creates a new instance of the settings.
// name should be the name of the command and comes from the first argument of the command line. // name should be the name of the command and comes from the first argument of the command line.
// os.Args[0] is a good choice. // os.Args[0] is a good choice.
......
...@@ -8,22 +8,31 @@ import ( ...@@ -8,22 +8,31 @@ import (
"testing" "testing"
) )
//func TestUsage(t *testing.T) { func TestUsage(t *testing.T) {
//
// commands := New("root", CmdTest1{}) commands := New("root", CmdTest1{})
// args := []string{"-h"} args := []string{"-h"}
//
// commands.Parse(args) commands.Parse(args)
//
// assert.False(t, commands.HasErrors()) assert.True(t, commands.HelpRequested())
// if commands.HasErrors() {
// t.Log(commands.Errors()) usage := commands.GetDefaults()
// } assert.Equal(t, " -a\tMessage A\n -x int\n \tMessage X\n", usage)
//
// usage := commands.Usage() }
// assert.NotEmpty(t, usage) func TestExecute(t *testing.T) {
// instance := execute("root", CmdTest1{}, "test", []string{"-a", "hello", "-x", "1"})
//} assert.NotNil(t, instance)
}
func TestExecuteHelp(t *testing.T) {
cnf := struct {
}{}
instance := execute(CmdTest1{}, &cnf, "test", []string{"-h"})
assert.False(t, instance.HasErrors())
}
func TestNewIntWithError(t *testing.T) { func TestNewIntWithError(t *testing.T) {
...@@ -47,17 +56,17 @@ func TestNew(t *testing.T) { ...@@ -47,17 +56,17 @@ func TestNew(t *testing.T) {
} }
type CmdTest1 struct { type CmdTest1 struct {
A bool `short:"a"` A bool `short:"a" description:"Message A"`
Sub1 struct { Sub1 struct {
B bool `short:"b"` B bool `short:"b" description:"Message B"`
Sub2 struct { Sub2 struct {
C bool `short:"c"` C bool `short:"c" description:"Message C"`
Sub3 struct { Sub3 struct {
D bool `short:"d"` D bool `short:"d" description:"Message D"`
} `command:"sub3"` } `command:"sub3"`
} `command:"sub2"` } `command:"sub2"`
} `command:"sub1"` } `command:"sub1"`
aa int `short:"x"` aa int `short:"x" description:"Message X"`
} }
func TestCommand2(t *testing.T) { func TestCommand2(t *testing.T) {
......
...@@ -3,7 +3,10 @@ ...@@ -3,7 +3,10 @@
package xflags package xflags
import "os" import (
"flag"
"os"
)
// ParseOsArgs parses the os.Args. // ParseOsArgs parses the os.Args.
func (s *Settings[C]) ParseOsArgs() *Settings[C] { func (s *Settings[C]) ParseOsArgs() *Settings[C] {
...@@ -38,3 +41,14 @@ func (s *Settings[C]) Parse(args []string) *Settings[C] { ...@@ -38,3 +41,14 @@ func (s *Settings[C]) Parse(args []string) *Settings[C] {
return s return s
} }
func (s *Settings[C]) HelpRequested() bool {
for _, err := range s.errors {
if err == flag.ErrHelp {
return true
}
}
return false
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment