@@ -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