1
1
package gflag
2
2
3
3
import (
4
- "strings"
5
-
6
- "github.com/gookit/gcli/v3/helper"
7
4
"github.com/gookit/goutil/arrutil"
5
+ "github.com/gookit/goutil/cflag"
8
6
"github.com/gookit/goutil/comdef"
9
7
"github.com/gookit/goutil/strutil"
10
8
)
@@ -24,45 +22,23 @@ func getRequiredMark(must bool) string {
24
22
}
25
23
26
24
// allowed keys on struct tag.
27
- var flagTagKeys = arrutil.Strings {"name" , "desc" , "required" , "default" , "shorts" }
28
-
29
- // parse tag named k-v value. item split by ';'
25
+ //
26
+ // Parse named rule: parse tag named k-v value. item split by ';'
30
27
//
31
28
// eg: "name=int0;shorts=i;required=true;desc=int option message"
32
29
//
33
- // supported field name:
30
+ // Supported field name:
34
31
//
35
32
// name
36
33
// desc
37
34
// shorts
38
35
// required
39
36
// default
40
- //
41
- // TODO use structs.ParseTagValueNamed()
42
- func parseNamedRule (name , rule string ) (mp map [string ]string ) {
43
- ss := strutil .Split (rule , ";" )
44
- if len (ss ) == 0 {
45
- return
46
- }
47
-
48
- mp = make (map [string ]string , len (flagTagKeys ))
49
- for _ , s := range ss {
50
- if strings .ContainsRune (s , '=' ) == false {
51
- helper .Panicf ("parse tag error on field '%s': item must match `KEY=VAL`" , name )
52
- }
53
-
54
- kvNodes := strings .SplitN (s , "=" , 2 )
55
- key , val := kvNodes [0 ], strings .TrimSpace (kvNodes [1 ])
56
- if ! flagTagKeys .Has (key ) {
57
- helper .Panicf ("parse tag error on field '%s': invalid key name '%s'" , name , key )
58
- }
59
-
60
- mp [key ] = val
61
- }
62
- return
63
- }
37
+ var flagTagKeys = arrutil.Strings {"name" , "desc" , "required" , "default" , "shorts" }
38
+ var flagTagKeys1 = arrutil.Strings {"desc" , "required" , "default" , "shorts" }
39
+ var flagArgKeys = arrutil.Strings {"desc" , "required" , "default" }
64
40
65
- // ParseSimpleRule struct tag value use simple rule. each item split by ';'
41
+ // struct tag value use simple rule. each item split by ';'
66
42
//
67
43
// - format: "name;desc;required;default;shorts"
68
44
// - format: "desc;required;default;shorts"
@@ -73,40 +49,29 @@ func parseNamedRule(name, rule string) (mp map[string]string) {
73
49
// "opt-name;int option message;;a,b"
74
50
// "int option message;;a,b;23"
75
51
//
76
- // returns field name:
52
+ // Returns field name:
77
53
//
78
54
// name
79
55
// desc
80
56
// shorts
81
57
// required
82
58
// default
83
- //
84
- // TODO use structs.ParseTagValueDefine() and support name.
85
- func ParseSimpleRule (name , rule string ) (mp map [string ]string ) {
86
- ss := strutil .SplitNTrimmed (rule , ";" , 4 )
59
+ func parseSimpleRule (rule string ) (mp map [string ]string ) {
60
+ ss := strutil .SplitNTrimmed (rule , ";" , 5 )
87
61
ln := len (ss )
88
62
if ln == 0 {
89
63
return
90
64
}
91
65
92
66
mp = make (map [string ]string , ln )
93
- mp ["desc" ] = ss [0 ]
94
67
if ln == 1 {
68
+ mp ["desc" ] = ss [0 ]
95
69
return
96
70
}
97
71
98
- required := ss [1 ]
99
- if required == "required" {
100
- required = "true"
101
- }
102
-
103
- mp ["required" ] = required
104
-
105
- // has shorts and default
106
- if ln > 3 {
107
- mp ["default" ], mp ["shorts" ] = ss [2 ], ss [3 ]
108
- } else if ln > 2 {
109
- mp ["default" ] = ss [2 ]
72
+ // first is name
73
+ if cflag .IsGoodName (ss [0 ]) {
74
+ return arrutil .CombineToSMap (flagTagKeys , ss )
110
75
}
111
- return
76
+ return arrutil . CombineToSMap ( flagTagKeys1 , ss )
112
77
}
0 commit comments