Skip to content

Commit 325ad13

Browse files
committed
refactor: remove extra loop in wildcard token
1 parent 098ce1d commit 325ad13

File tree

2 files changed

+203
-166
lines changed

2 files changed

+203
-166
lines changed

token/wildcard.go

+28-18
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,25 @@ func (token *wildcardToken) Apply(root, current interface{}, next []Token) (inte
2323

2424
elements := make([]interface{}, 0)
2525

26+
var nextToken Token
27+
var futureTokens []Token
28+
29+
if len(next) > 0 {
30+
nextToken = next[0]
31+
futureTokens = next[1:]
32+
}
33+
34+
handleNext := func(item interface{}) (interface{}, bool) {
35+
if nextToken == nil {
36+
return item, true
37+
}
38+
result, _ := nextToken.Apply(root, item, futureTokens)
39+
if result == nil {
40+
return nil, false
41+
}
42+
return result, true
43+
}
44+
2645
objType, objVal := getTypeAndValue(current)
2746
if objType == nil {
2847
return nil, getInvalidTokenTargetNilError(
@@ -37,20 +56,26 @@ func (token *wildcardToken) Apply(root, current interface{}, next []Token) (inte
3756
sortMapKeys(keys)
3857
for _, kv := range keys {
3958
value := objVal.MapIndex(kv).Interface()
40-
elements = append(elements, value)
59+
if item, add := handleNext(value); add {
60+
elements = append(elements, item)
61+
}
4162
}
4263
break
4364
case reflect.Array, reflect.Slice:
4465
length := objVal.Len()
4566
for i := 0; i < length; i++ {
4667
value := objVal.Index(i).Interface()
47-
elements = append(elements, value)
68+
if item, add := handleNext(value); add {
69+
elements = append(elements, item)
70+
}
4871
}
4972
case reflect.Struct:
5073
fields := getStructFields(objVal, true)
5174
for _, field := range fields {
5275
value := objVal.FieldByName(field.Name).Interface()
53-
elements = append(elements, value)
76+
if item, add := handleNext(value); add {
77+
elements = append(elements, item)
78+
}
5479
}
5580
break
5681
default:
@@ -61,20 +86,5 @@ func (token *wildcardToken) Apply(root, current interface{}, next []Token) (inte
6186
)
6287
}
6388

64-
if len(next) > 0 {
65-
nextToken := next[0]
66-
futureTokens := next[1:]
67-
68-
results := make([]interface{}, 0)
69-
70-
for _, item := range elements {
71-
result, _ := nextToken.Apply(root, item, futureTokens)
72-
if result != nil {
73-
results = append(results, result)
74-
}
75-
}
76-
77-
return results, nil
78-
}
7989
return elements, nil
8090
}

0 commit comments

Comments
 (0)