@@ -101,21 +101,7 @@ impl UnionElement {
101
101
UnionElement :: Name ( name) => Box :: new ( v. get ( name) . into_iter ( ) ) ,
102
102
UnionElement :: Slice ( slice) => {
103
103
if let Value :: Array ( arr) = v {
104
- let step = slice. step . unwrap_or ( 1 ) ;
105
-
106
- let len = arr. len ( ) ;
107
-
108
- let start = slice
109
- . start
110
- . map ( |s| if s < 0 { s + ( len as isize ) } else { s } )
111
- . unwrap_or ( if step > 0 { 0 } else { ( len as isize ) - 1 } ) ;
112
-
113
- let end = slice
114
- . end
115
- . map ( |e| if e < 0 { e + ( len as isize ) } else { e } )
116
- . unwrap_or ( if step > 0 { len as isize } else { -1 } ) ;
117
-
118
- Box :: new ( array_slice ( arr, start, end, step) )
104
+ Box :: new ( array_slice ( arr, slice. start , slice. end , slice. step ) )
119
105
} else {
120
106
Box :: new ( iter:: empty ( ) )
121
107
}
@@ -125,8 +111,24 @@ impl UnionElement {
125
111
}
126
112
}
127
113
128
- fn array_slice ( arr : & [ Value ] , start : isize , end : isize , step : isize ) -> Iter < ' _ > {
114
+ fn array_slice (
115
+ arr : & [ Value ] ,
116
+ optional_start : Option < isize > ,
117
+ optional_end : Option < isize > ,
118
+ optional_step : Option < isize > ,
119
+ ) -> Iter < ' _ > {
120
+ let step = optional_step. unwrap_or ( 1 ) ;
121
+
129
122
let len = arr. len ( ) ;
123
+
124
+ let start = optional_start
125
+ . map ( |s| if s < 0 { s + ( len as isize ) } else { s } )
126
+ . unwrap_or ( if step > 0 { 0 } else { ( len as isize ) - 1 } ) ;
127
+
128
+ let end = optional_end
129
+ . map ( |e| if e < 0 { e + ( len as isize ) } else { e } )
130
+ . unwrap_or ( if step > 0 { len as isize } else { -1 } ) ;
131
+
130
132
let mut sl = vec ! [ ] ;
131
133
match step. cmp ( & 0 ) {
132
134
Ordering :: Greater => {
0 commit comments