@@ -20,81 +20,65 @@ func (token *recursiveToken) Type() string {
20
20
}
21
21
22
22
func (token * recursiveToken ) Apply (root , current interface {}, next []Token ) (interface {}, error ) {
23
+ return token .recursiveApply (root , current , next ), nil
24
+ }
23
25
24
- elements := flatten (current )
25
-
26
- if len (next ) > 0 {
27
- nextToken := next [0 ]
28
- futureTokens := next [1 :]
26
+ func (token * recursiveToken ) recursiveApply (root , current interface {}, next []Token ) []interface {} {
29
27
30
- results := make ([]interface {}, 0 )
28
+ slice := make ([]interface {}, 0 )
31
29
32
- for _ , item := range elements {
33
- result , _ := nextToken .Apply (root , item , futureTokens )
34
- objType , objVal := getTypeAndValue (result )
35
- if objType == nil {
36
- continue
37
- }
30
+ objType , objVal := getTypeAndValue (current )
31
+ if objType == nil {
32
+ return slice
33
+ }
38
34
35
+ if len (next ) > 0 {
36
+ result , _ := next [0 ].Apply (root , objVal .Interface (), next [1 :])
37
+ objType , objVal := getTypeAndValue (result )
38
+ if objType != nil {
39
39
switch objType .Kind () {
40
40
case reflect .Array , reflect .Slice :
41
41
length := objVal .Len ()
42
42
for i := 0 ; i < length ; i ++ {
43
- results = append (results , objVal .Index (i ).Interface ())
43
+ slice = append (slice , objVal .Index (i ).Interface ())
44
44
}
45
45
break
46
46
default :
47
- results = append (results , result )
47
+ slice = append (slice , objVal . Interface () )
48
48
break
49
49
}
50
-
51
50
}
52
-
53
- return results , nil
51
+ } else {
52
+ slice = append ( slice , objVal . Interface ())
54
53
}
55
- return elements , nil
56
- }
57
54
58
- func flatten (obj interface {}) []interface {} {
59
- slice := make ([]interface {}, 0 )
60
-
61
- objType , objVal := getTypeAndValue (obj )
62
- if objType == nil {
63
- return slice
64
- }
65
-
66
- slice = append (slice , objVal .Interface ())
67
-
68
- elements := make ([]interface {}, 0 )
69
55
switch objType .Kind () {
70
56
case reflect .Map :
71
57
keys := objVal .MapKeys ()
72
58
sortMapKeys (keys )
73
59
for _ , kv := range keys {
74
60
value := objVal .MapIndex (kv ).Interface ()
75
- elements = append (elements , value )
61
+ result := token .recursiveApply (root , value , next )
62
+ slice = append (slice , result ... )
76
63
}
77
64
case reflect .Array , reflect .Slice :
78
65
length := objVal .Len ()
79
66
for i := 0 ; i < length ; i ++ {
80
67
value := objVal .Index (i ).Interface ()
81
- elements = append (elements , value )
68
+ result := token .recursiveApply (root , value , next )
69
+ slice = append (slice , result ... )
82
70
}
83
71
case reflect .Struct :
84
72
fields := getStructFields (objVal , true )
85
73
for _ , field := range fields {
86
74
value := objVal .FieldByName (field .Name ).Interface ()
87
- elements = append (elements , value )
75
+ result := token .recursiveApply (root , value , next )
76
+ slice = append (slice , result ... )
77
+
88
78
}
89
79
default :
90
80
break
91
81
}
92
82
93
- if len (elements ) > 0 {
94
- for _ , sObj := range elements {
95
- slice = append (slice , flatten (sObj )... )
96
- }
97
- }
98
-
99
83
return slice
100
84
}
0 commit comments