Implementing ByteStream interuption on infinite stream (#13552)

# Description

This PR should address #13530 by explicitly handling ByteStreams. 

The issue can be replicated easily on linux by running:

```nushell
open /dev/urandom | into binary | bytes at ..10
```

Would leave the output hanging and with no way to cancel it, this was
likely because it was trying to collect the input stream and would not
complete.

I have also put in an error to say that using negative offsets for a
bytestream without a length cannot be used.

```nushell
~/git/nushell> open /dev/urandom | into binary | bytes at (-1)..
Error: nu:🐚:incorrect_value

  × Incorrect value.
   ╭─[entry #3:1:35]
 1 │ open /dev/urandom | into binary | bytes at (-1)..
   ·                                   ────┬─── ───┬──
   ·                                       │       ╰── encountered here
   ·                                       ╰── Negative range values cannot be used with streams that don't specify a length
   ╰────
   ```

# User-Facing Changes

No operation changes, only the warning you get back for negative offsets

# Tests + Formatting

Ran `toolkit check pr ` with no errors or warnings

Manual testing of the example commands above

---------

Co-authored-by: Ian Manske <ian.manske@pm.me>
Co-authored-by: Simon Curtis <simon.curtis@candc-uk.com>
This commit is contained in:
Simon Curtis
2025-01-11 21:28:08 +00:00
committed by GitHub
parent 0b71eb201c
commit f05162811c
15 changed files with 612 additions and 103 deletions

View File

@ -139,6 +139,7 @@ pub fn eval_block(
}
pub fn check_example_evaluates_to_expected_output(
cmd_name: &str,
example: &Example,
cwd: &std::path::Path,
engine_state: &mut Box<EngineState>,
@ -159,11 +160,17 @@ pub fn check_example_evaluates_to_expected_output(
// If the command you are testing requires to compare another case, then
// you need to define its equality in the Value struct
if let Some(expected) = example.result.as_ref() {
let expected = DebuggableValue(expected);
let result = DebuggableValue(&result);
assert_eq!(
DebuggableValue(&result),
DebuggableValue(expected),
"The example result differs from the expected value",
)
result,
expected,
"Error: The result of example '{}' for the command '{}' differs from the expected value.\n\nExpected: {:?}\nActual: {:?}\n",
example.description,
cmd_name,
expected,
result,
);
}
}