@@ -31,27 +31,28 @@ impl Function for Skip {
3131 fn invoke ( & self , args : & [ Value ] , _context : & Context ) -> Result < Value , DscError > {
3232 debug ! ( "{}" , t!( "functions.skip.invoked" ) ) ;
3333
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+ } ;
4140
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+ }
4746
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+ }
4951
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 ( ) ) ) ;
5253 }
5354
54- Err ( DscError :: Parser ( t ! ( "functions.skip.invalidOriginalValue " ) . to_string ( ) ) )
55+ Err ( DscError :: Parser ( t ! ( "functions.skip.invalidNumberToSkip " ) . to_string ( ) ) )
5556 }
5657}
5758
@@ -81,4 +82,22 @@ mod tests {
8182 let result = parser. parse_and_execute ( "[skip(createArray('a','b'), 5)]" , & Context :: new ( ) ) . unwrap ( ) ;
8283 assert_eq ! ( result, Value :: Array ( vec![ ] ) ) ;
8384 }
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+ }
84103}
0 commit comments