@@ -31,27 +31,28 @@ impl Function for Skip {
31
31
fn invoke ( & self , args : & [ Value ] , _context : & Context ) -> Result < Value , DscError > {
32
32
debug ! ( "{}" , t!( "functions.skip.invoked" ) ) ;
33
33
34
- let Some ( count_i64) = args[ 1 ] . as_i64 ( ) else {
35
- return Err ( DscError :: Parser ( t ! ( "functions.skip.invalidNumberToSkip" ) . to_string ( ) ) ) ;
36
- } ;
37
- if count_i64 < 0 {
38
- return Err ( DscError :: Parser ( t ! ( "functions.skip.negativeNotAllowed" ) . to_string ( ) ) ) ;
39
- }
40
- let count: usize = count_i64. try_into ( ) . unwrap_or ( usize:: MAX ) ;
34
+ if let Some ( count_i64) = args[ 1 ] . as_i64 ( ) {
35
+ let count: usize = if count_i64 < 0 {
36
+ 0
37
+ } else {
38
+ count_i64. try_into ( ) . unwrap_or ( usize:: MAX )
39
+ } ;
41
40
42
- if let Some ( array) = args[ 0 ] . as_array ( ) {
43
- if count >= array. len ( ) { return Ok ( Value :: Array ( vec ! [ ] ) ) ; }
44
- let skipped = array. iter ( ) . skip ( count) . cloned ( ) . collect :: < Vec < Value > > ( ) ;
45
- return Ok ( Value :: Array ( skipped) ) ;
46
- }
41
+ if let Some ( array) = args[ 0 ] . as_array ( ) {
42
+ if count >= array. len ( ) { return Ok ( Value :: Array ( vec ! [ ] ) ) ; }
43
+ let skipped = array. iter ( ) . skip ( count) . cloned ( ) . collect :: < Vec < Value > > ( ) ;
44
+ return Ok ( Value :: Array ( skipped) ) ;
45
+ }
47
46
48
- if let Some ( s) = args[ 0 ] . as_str ( ) {
47
+ if let Some ( s) = args[ 0 ] . as_str ( ) {
48
+ let result: String = s. chars ( ) . skip ( count) . collect ( ) ;
49
+ return Ok ( Value :: String ( result) ) ;
50
+ }
49
51
50
- let result: String = s. chars ( ) . skip ( count) . collect ( ) ;
51
- return Ok ( Value :: String ( result) ) ;
52
+ return Err ( DscError :: Parser ( t ! ( "functions.skip.invalidOriginalValue" ) . to_string ( ) ) ) ;
52
53
}
53
54
54
- Err ( DscError :: Parser ( t ! ( "functions.skip.invalidOriginalValue " ) . to_string ( ) ) )
55
+ Err ( DscError :: Parser ( t ! ( "functions.skip.invalidNumberToSkip " ) . to_string ( ) ) )
55
56
}
56
57
}
57
58
@@ -81,4 +82,22 @@ mod tests {
81
82
let result = parser. parse_and_execute ( "[skip(createArray('a','b'), 5)]" , & Context :: new ( ) ) . unwrap ( ) ;
82
83
assert_eq ! ( result, Value :: Array ( vec![ ] ) ) ;
83
84
}
85
+
86
+ #[ test]
87
+ fn skip_array_negative_is_zero ( ) {
88
+ let mut parser = Statement :: new ( ) . unwrap ( ) ;
89
+ let result = parser. parse_and_execute ( "[skip(createArray('a','b','c'), -1)]" , & Context :: new ( ) ) . unwrap ( ) ;
90
+ assert_eq ! ( result, Value :: Array ( vec![
91
+ Value :: String ( "a" . into( ) ) ,
92
+ Value :: String ( "b" . into( ) ) ,
93
+ Value :: String ( "c" . into( ) ) ,
94
+ ] ) ) ;
95
+ }
96
+
97
+ #[ test]
98
+ fn skip_string_negative_is_zero ( ) {
99
+ let mut parser = Statement :: new ( ) . unwrap ( ) ;
100
+ let result = parser. parse_and_execute ( "[skip('ab', -2)]" , & Context :: new ( ) ) . unwrap ( ) ;
101
+ assert_eq ! ( result, Value :: String ( "ab" . into( ) ) ) ;
102
+ }
84
103
}
0 commit comments