@@ -23,6 +23,25 @@ func (token *wildcardToken) Apply(root, current interface{}, next []Token) (inte
23
23
24
24
elements := make ([]interface {}, 0 )
25
25
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
+
26
45
objType , objVal := getTypeAndValue (current )
27
46
if objType == nil {
28
47
return nil , getInvalidTokenTargetNilError (
@@ -37,20 +56,26 @@ func (token *wildcardToken) Apply(root, current interface{}, next []Token) (inte
37
56
sortMapKeys (keys )
38
57
for _ , kv := range keys {
39
58
value := objVal .MapIndex (kv ).Interface ()
40
- elements = append (elements , value )
59
+ if item , add := handleNext (value ); add {
60
+ elements = append (elements , item )
61
+ }
41
62
}
42
63
break
43
64
case reflect .Array , reflect .Slice :
44
65
length := objVal .Len ()
45
66
for i := 0 ; i < length ; i ++ {
46
67
value := objVal .Index (i ).Interface ()
47
- elements = append (elements , value )
68
+ if item , add := handleNext (value ); add {
69
+ elements = append (elements , item )
70
+ }
48
71
}
49
72
case reflect .Struct :
50
73
fields := getStructFields (objVal , true )
51
74
for _ , field := range fields {
52
75
value := objVal .FieldByName (field .Name ).Interface ()
53
- elements = append (elements , value )
76
+ if item , add := handleNext (value ); add {
77
+ elements = append (elements , item )
78
+ }
54
79
}
55
80
break
56
81
default :
@@ -61,20 +86,5 @@ func (token *wildcardToken) Apply(root, current interface{}, next []Token) (inte
61
86
)
62
87
}
63
88
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
- }
79
89
return elements , nil
80
90
}
0 commit comments