Skip to content

Commit 6b02b95

Browse files
committed
fix: fix option parser
1 parent d74a745 commit 6b02b95

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

utils/string_utils.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ func ParseArr(str string) ([]string, error) {
2929
newstr = strings.ReplaceAll(newstr, " ]", "]")
3030
newstr = strings.ReplaceAll(newstr, "[ ", "[")
3131
newstr = strings.ReplaceAll(newstr, " ", " ")
32+
// 特殊处理 ', 不进行转义分析
33+
newstr = strings.ReplaceAll(newstr, "'", "@&@")
3234
newstr = strings.TrimSpace(newstr)
3335
if len(newstr) == len(str) {
3436
break
@@ -75,6 +77,10 @@ func ParseArr(str string) ([]string, error) {
7577
kend = i
7678
key = str[kstart:kend]
7779
kstart = i + 1
80+
key = strings.TrimSpace(key)
81+
key = strings.TrimPrefix(key, `"`)
82+
key = strings.TrimSuffix(key, `"`)
83+
key = strings.ReplaceAll(key, `@&@`, `'`)
7884
result = append(result, key)
7985
}
8086
continue
@@ -86,6 +92,10 @@ func ParseArr(str string) ([]string, error) {
8692
return nil, errors.New("grammar error for:" + str)
8793
}
8894
key = str[kstart:kend]
95+
key = strings.TrimSpace(key)
96+
key = strings.TrimPrefix(key, `"`)
97+
key = strings.TrimSuffix(key, `"`)
98+
key = strings.ReplaceAll(key, `@&@`, `'`)
8999
result = append(result, key)
90100
return result, nil
91101
} else {
@@ -109,6 +119,8 @@ func ParseKV(str string) (map[string]string, error) {
109119
newstr = strings.ReplaceAll(newstr, ": ", ":")
110120
newstr = strings.ReplaceAll(newstr, " ,", ",")
111121
newstr = strings.ReplaceAll(newstr, " ", " ")
122+
// 特殊处理 ', 不进行转义分析
123+
newstr = strings.ReplaceAll(newstr, "'", "@&@")
112124
newstr = strings.TrimSpace(newstr)
113125
if len(newstr) == len(str) {
114126
break
@@ -171,7 +183,11 @@ func ParseKV(str string) (map[string]string, error) {
171183
if strings.HasSuffix(value, ",") {
172184
value = strings.TrimSuffix(value, ",")
173185
}
174-
result[strings.TrimSpace(key)] = strings.TrimSpace(value)
186+
value = strings.TrimSpace(value)
187+
value = strings.TrimPrefix(value, `"`)
188+
value = strings.TrimSuffix(value, `"`)
189+
value = strings.ReplaceAll(value, `@&@`, `'`)
190+
result[strings.TrimSpace(key)] = value
175191
}
176192
continue
177193
}
@@ -189,7 +205,11 @@ func ParseKV(str string) (map[string]string, error) {
189205
if strings.HasSuffix(value, ",") {
190206
value = strings.TrimSuffix(value, ",")
191207
}
192-
result[strings.TrimSpace(key)] = strings.TrimSpace(value)
208+
value = strings.TrimSpace(value)
209+
value = strings.TrimPrefix(value, `"`)
210+
value = strings.TrimSuffix(value, `"`)
211+
value = strings.ReplaceAll(value, `@&@`, `'`)
212+
result[strings.TrimSpace(key)] = value
193213
return result, nil
194214
} else {
195215
if dq && sq {

utils/utils_test.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@ func TestParseKV(t *testing.T) {
7575
input = "{\n valuemap:{k1:v1 k2:v2 k3:}\n valuelist:[a,b,c,d]\n valueset:[{email:e1},{email:e2}]\n valuelistset:[[a,b,c],[d,e,f]]\n valuelistsetstruct:[[{email:e1},{email:e2}],[{email:e3},{email:e4}]]\n valuemapStruct:[k1:{email:e1} k2:{email:e2}]\n }"
7676
kv, err = ParseKV(input)
7777
assert(t, err == nil)
78+
79+
// quote test
80+
input = `{k1:"Hes Value" k2:normal, k3:"He's fine"}`
81+
kv, err = ParseKV(input)
82+
assert(t, err == nil && len(kv) == 3)
83+
assert(t, kv["k1"] == `Hes Value`)
84+
assert(t, kv["k2"] == "normal")
85+
assert(t, kv["k3"] == `He's fine`)
7886
}
7987

8088
func TestParseArr(t *testing.T) {
@@ -89,12 +97,12 @@ func TestParseArr(t *testing.T) {
8997
arr, err = ParseArr(input)
9098
assert(t, err == nil && len(arr) == 3)
9199
assert(t, arr[0] == "a")
92-
assert(t, arr[1] == "\"b\"")
100+
assert(t, arr[1] == "b")
93101
assert(t, arr[2] == "c")
94102

95-
input = "[a,'b,c]"
96-
arr, err = ParseArr(input)
97-
assert(t, err != nil)
103+
// input = "[a,'b,c]"
104+
// arr, err = ParseArr(input)
105+
// assert(t, err != nil)
98106

99107
input = "[a,[b,c],c]"
100108
arr, err = ParseArr(input)
@@ -118,6 +126,14 @@ func TestParseArr(t *testing.T) {
118126
assert(t, arr[1] == "[b,{c,d}]")
119127
assert(t, arr[2] == "c")
120128
assert(t, arr[3] == "{e,f}")
129+
130+
input = "[a's,b,c,\"d's ok\"]"
131+
arr, err = ParseArr(input)
132+
assert(t, err == nil && len(arr) == 4)
133+
assert(t, arr[0] == "a's")
134+
assert(t, arr[1] == "b")
135+
assert(t, arr[2] == "c")
136+
assert(t, arr[3] == "d's ok")
121137
}
122138

123139
func assert(t *testing.T, cond bool, val ...interface{}) {

0 commit comments

Comments
 (0)