fix ranges over zero-length input (#15062)

Fixes #15061

# User-Facing Changes

Fixes panics when slicing empty input with inclusive ranges:

```nushell
> random binary 0 | bytes at 0..0
Error:   x Main thread panicked.
  |-> at crates/nu-protocol/src/value/range.rs:118:42
  `-> attempt to subtract with overflow
```
This commit is contained in:
Solomon 2025-02-08 17:57:28 -07:00 committed by GitHub
parent 26897b287c
commit 31e1f49cb6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 9 additions and 1 deletions

View File

@ -388,6 +388,13 @@ fn substring_by_negative_index() {
})
}
#[test]
fn substring_of_empty_string() {
let actual = nu!("'' | str substring ..0");
assert_eq!(actual.err, "");
assert_eq!(actual.out, "");
}
#[test]
fn str_reverse() {
let actual = nu!(r#"

View File

@ -112,8 +112,9 @@ mod int_range {
match self.end {
Bound::Unbounded => Bound::Unbounded,
Bound::Included(i) => match i {
_ if len == 0 => Bound::Excluded(0),
i if i < 0 => Bound::Excluded(len.saturating_sub((i + 1).unsigned_abs())),
i => Bound::Included((len - 1).min(i.unsigned_abs())),
i => Bound::Included((len.saturating_sub(1)).min(i.unsigned_abs())),
},
Bound::Excluded(i) => Bound::Excluded(match i {
i if i < 0 => len.saturating_sub(i.unsigned_abs()),