Skip to content

Commit b626981

Browse files
committed
save
1 parent de21517 commit b626981

File tree

4 files changed

+119
-35
lines changed

4 files changed

+119
-35
lines changed

command-help-cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func (thisRef *Command) showUsage() {
155155
commandDisplayData = c.Description + " (" + strings.TrimSpace(c.Name) + ")"
156156
}
157157

158-
// pring sub-command as header
158+
// print sub-command as header
159159
if !firstOnePrinted {
160160
// fmt.Println(" " + strings.Repeat(constThinHorizontalLine, constShortLineLength-12))
161161
fmt.Println(fmt.Sprintf(" %s ", commandDisplayData))

command-helpers.go

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ func (thisRef *Command) flagNeededCommandsForExecuteAndPopulateTheirFlags(args [
3232
}
3333
}
3434

35-
requriedFlags := thisRef.getRequriedFlags()
36-
setRequriedFlagAsSet := func(flagName string) {
37-
for i := 0; i < len(requriedFlags); i++ {
38-
if requriedFlags[i].name == flagName {
39-
requriedFlags[i].wasSet = true
35+
requiredFlags := thisRef.getRequiredFlags()
36+
setRequiredFlagAsSet := func(flagName string) {
37+
for i := 0; i < len(requiredFlags); i++ {
38+
if requiredFlags[i].name == flagName {
39+
requiredFlags[i].wasSet = true
4040
break
4141
}
4242
}
@@ -58,7 +58,7 @@ func (thisRef *Command) flagNeededCommandsForExecuteAndPopulateTheirFlags(args [
5858
setFlagWithDefaultValue(flagName)
5959
if thisRef.getFlag(flagName).Kind() == reflect.Bool {
6060
thisRef.setFlagValue(flagName, "true")
61-
setRequriedFlagAsSet(flagName)
61+
setRequiredFlagAsSet(flagName)
6262
}
6363

6464
continue
@@ -71,7 +71,7 @@ func (thisRef *Command) flagNeededCommandsForExecuteAndPopulateTheirFlags(args [
7171
setFlagWithDefaultValue(flagName)
7272
if thisRef.getFlag(flagName).Kind() == reflect.Bool {
7373
thisRef.setFlagValue(flagName, "true")
74-
setRequriedFlagAsSet(flagName)
74+
setRequiredFlagAsSet(flagName)
7575
}
7676

7777
continue
@@ -80,7 +80,7 @@ func (thisRef *Command) flagNeededCommandsForExecuteAndPopulateTheirFlags(args [
8080
// case 3 - this is a flag value, then set the value to the current `Flags` struct
8181
flagValue := args[nextIndex]
8282
thisRef.setFlagValue(flagName, flagValue)
83-
setRequriedFlagAsSet(flagName)
83+
setRequiredFlagAsSet(flagName)
8484
index = nextIndex
8585
continue
8686
}
@@ -90,7 +90,7 @@ func (thisRef *Command) flagNeededCommandsForExecuteAndPopulateTheirFlags(args [
9090
setFlagWithDefaultValue(flagName)
9191
if thisRef.getFlag(flagName).Kind() == reflect.Bool {
9292
thisRef.setFlagValue(flagName, "true")
93-
setRequriedFlagAsSet(flagName)
93+
setRequiredFlagAsSet(flagName)
9494
}
9595

9696
continue
@@ -115,12 +115,12 @@ func (thisRef *Command) flagNeededCommandsForExecuteAndPopulateTheirFlags(args [
115115
continue
116116
}
117117

118-
// case 3 - uknown COMMAND or FLAG
118+
// case 3 - unknown COMMAND or FLAG
119119
// ignore
120120
}
121121

122122
// check that all required flags are set
123-
for _, rf := range requriedFlags {
123+
for _, rf := range requiredFlags {
124124
if !rf.wasSet {
125125
updateErrorToReturn(fmt.Errorf("Missing required flag [%s]", rf.name))
126126
break
@@ -198,7 +198,7 @@ func (thisRef *Command) setFlagValue(flagName string, flagValue string) {
198198
// update the struct field value
199199
updateHappened := false
200200
for i := 0; i < runtimeStructRef.NumField(); i++ {
201-
attrFlagName := runtimeStructRef.Type().Field(i).Tag.Get("flagName")
201+
attrFlagName := runtimeStructRef.Type().Field(i).Tag.Get(flagNameTag)
202202
if attrFlagName == flagName {
203203
field := runtimeStructRef.Field(i)
204204
setFieldValue(field, flagValue)
@@ -222,7 +222,7 @@ func (thisRef *Command) getFlag(flagName string) reflect.Value {
222222
}
223223

224224
for i := 0; i < runtimeStructRef.NumField(); i++ {
225-
attrFlagName := runtimeStructRef.Type().Field(i).Tag.Get("flagName")
225+
attrFlagName := runtimeStructRef.Type().Field(i).Tag.Get(flagNameTag)
226226
if attrFlagName == flagName {
227227
result = runtimeStructRef.Field(i)
228228
break
@@ -248,22 +248,34 @@ func setFieldValue(field reflect.Value, valueAsString string) {
248248
fallthrough
249249
case reflect.Func:
250250
fallthrough
251-
case reflect.Interface:
252-
fallthrough
253251
case reflect.Map:
254252
fallthrough
255-
case reflect.Ptr:
256-
fallthrough
257253
case reflect.Slice:
258254
fallthrough
259255
case reflect.Struct:
260256
fallthrough
261257
case reflect.UnsafePointer:
258+
fallthrough
259+
case reflect.Interface:
262260
// INFO: ignore
263261

262+
case reflect.Ptr:
263+
setBasicTypeValue(&field, field.Type().Elem().Kind(), valueAsString)
264+
265+
default:
266+
setBasicTypeValue(&field, field.Kind(), valueAsString)
267+
}
268+
}
269+
270+
func setBasicTypeValue(field *reflect.Value, kind reflect.Kind, valueAsString string) {
271+
switch kind {
264272
case reflect.Bool:
265273
value, _ := strconv.ParseBool(valueAsString)
266-
field.SetBool(value)
274+
if field.Kind() == reflect.Ptr {
275+
field.Set(reflect.ValueOf(&value))
276+
} else {
277+
field.SetBool(value)
278+
}
267279

268280
case reflect.Int:
269281
fallthrough
@@ -275,7 +287,12 @@ func setFieldValue(field reflect.Value, valueAsString string) {
275287
fallthrough
276288
case reflect.Int64:
277289
value, _ := strconv.ParseInt(valueAsString, 10, 64)
278-
field.SetInt(value)
290+
if field.Kind() == reflect.Ptr {
291+
valueAsInt32 := int(value) // FIXME: for some reason next line fails to work with int64
292+
field.Set(reflect.ValueOf(&valueAsInt32))
293+
} else {
294+
field.SetInt(value)
295+
}
279296

280297
case reflect.Uint:
281298
fallthrough
@@ -287,16 +304,31 @@ func setFieldValue(field reflect.Value, valueAsString string) {
287304
fallthrough
288305
case reflect.Uint64:
289306
value, _ := strconv.ParseUint(valueAsString, 10, 64)
290-
field.SetUint(value)
307+
if field.Kind() == reflect.Ptr {
308+
valueAsUint32 := uint(value) // FIXME: for some reason next line fails to work with Uint64
309+
field.Set(reflect.ValueOf(&valueAsUint32))
310+
} else {
311+
field.SetUint(value)
312+
}
291313

292314
case reflect.Float32:
293315
fallthrough
294316
case reflect.Float64:
295317
value, _ := strconv.ParseFloat(valueAsString, 64)
296-
field.SetFloat(value)
318+
if field.Kind() == reflect.Ptr {
319+
valueAsFloat32 := float32(value) // FIXME: for some reason next line fails to work with float64
320+
field.Set(reflect.ValueOf(&valueAsFloat32))
321+
} else {
322+
field.SetFloat(value)
323+
}
297324

298325
case reflect.String:
299-
field.SetString(valueAsString)
326+
if field.Kind() == reflect.Ptr {
327+
field.Set(reflect.ValueOf(&valueAsString))
328+
} else {
329+
field.SetString(valueAsString)
330+
}
331+
300332
}
301333
}
302334

flag.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ var flagPatterns = []string{
1111
}
1212

1313
// {flagRequired} and {flagDefault} are MUTUALLY EXCLUSIVE
14-
const flagName = "flagName" //
15-
const flagRequired = "flagRequired" // required - needs inpuut from user
16-
const flagDefault = "flagDefault" // default - would be the value if not set
17-
const flagDescription = "flagDescription" //
18-
const flagHidden = "flagHidden" //
14+
const flagNameTag = "flagName" //
15+
const flagRequiredTag = "flagRequired" // required - needs input from user
16+
const flagDefaultTag = "flagDefault" // default - would be the value if not set, if pointer and no default then it will be null
17+
const flagDescriptionTag = "flagDescription" //
18+
const flagHiddenTag = "flagHidden" //
1919

2020
type flag struct {
2121
name string
@@ -49,15 +49,15 @@ func (thisRef *Command) getDefinedFlags() []flag {
4949

5050
for i := 0; i < runtimeStructRef.NumField(); i++ {
5151
newFlag := flag{
52-
name: runtimeStructRef.Type().Field(i).Tag.Get(flagName),
52+
name: runtimeStructRef.Type().Field(i).Tag.Get(flagNameTag),
5353
typeName: runtimeStructRef.Type().Field(i).Type.Name(),
54-
isRequired: runtimeStructRef.Type().Field(i).Tag.Get(flagRequired),
55-
defaultValue: runtimeStructRef.Type().Field(i).Tag.Get(flagDefault),
56-
description: runtimeStructRef.Type().Field(i).Tag.Get(flagDescription),
57-
isHidden: runtimeStructRef.Type().Field(i).Tag.Get(flagHidden),
54+
isRequired: runtimeStructRef.Type().Field(i).Tag.Get(flagRequiredTag),
55+
defaultValue: runtimeStructRef.Type().Field(i).Tag.Get(flagDefaultTag),
56+
description: runtimeStructRef.Type().Field(i).Tag.Get(flagDescriptionTag),
57+
isHidden: runtimeStructRef.Type().Field(i).Tag.Get(flagHiddenTag),
5858
}
5959

60-
if _, tagFound := runtimeStructRef.Type().Field(i).Tag.Lookup(flagDefault); tagFound {
60+
if _, tagFound := runtimeStructRef.Type().Field(i).Tag.Lookup(flagDefaultTag); tagFound {
6161
newFlag.defaultValueWasRequested = true
6262
}
6363

@@ -71,7 +71,7 @@ func (thisRef *Command) getDefinedFlags() []flag {
7171
return result
7272
}
7373

74-
func (thisRef *Command) getRequriedFlags() []flag {
74+
func (thisRef *Command) getRequiredFlags() []flag {
7575
result := []flag{}
7676

7777
for _, definedFlag := range thisRef.getDefinedFlags() {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package tests
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"log"
7+
"os"
8+
"path/filepath"
9+
"strings"
10+
"testing"
11+
12+
clicmdflags "github.com/remoteit/systemkit-clicmdflags"
13+
)
14+
15+
type cmdPointerFlags struct {
16+
Val1 string `flagName:"val1" flagRequired:"false"`
17+
Val2 *string `flagName:"val2" flagRequired:"false"`
18+
Val3 *int `flagName:"val3" flagRequired:"false"`
19+
Val4 *bool `flagName:"val4" flagRequired:"false"`
20+
Val5 *float32 `flagName:"val5" flagRequired:"false"`
21+
}
22+
23+
func Test00_SingleCommandPointer(t *testing.T) {
24+
// os.Args = append(os.Args, strings.Split("--val1 aaaaa --val2 bbbbb --val3 10 --val4 true --val5 3.2", " ")...)
25+
os.Args = append(os.Args, strings.Split(" --val1 aaaaa --val2 bbbbb --val4 true ", " ")...)
26+
27+
var cmd = &clicmdflags.Command{
28+
Name: filepath.Base(os.Args[0]),
29+
Examples: []string{
30+
filepath.Base(os.Args[0]) + " -json",
31+
filepath.Base(os.Args[0]) + " -json true",
32+
},
33+
Flags: cmdPointerFlags{},
34+
Handler: func(command *clicmdflags.Command) {
35+
fmt.Println("Handler()")
36+
},
37+
}
38+
39+
cmd.AddCommand(&clicmdflags.Command{
40+
Name: "pointerTest",
41+
Handler: func(command *clicmdflags.Command) {
42+
fmt.Println("ScanHandler()")
43+
},
44+
})
45+
46+
if err := cmd.Execute(); err != nil {
47+
log.Fatal(err)
48+
}
49+
50+
a, _ := json.Marshal(cmd.Flags)
51+
fmt.Println(string(a))
52+
}

0 commit comments

Comments
 (0)