mirror of
https://github.com/nushell/nushell.git
synced 2025-08-13 08:17:44 +02:00
Fixes #15440 # Description Wraps ListStream stream type from `impl Iterator` to `Peekable<impl Iterator>`, this allows checking for empty streams and treating them as empty values Example: ``` # previously $ glob ? | default -e void > # empty list $ echo '' | default -e void > void #################### # now $ glob ? | default -e void > void $ echo '' | default -e void > void ``` # User-Facing Changes empty list streams will behave as `nothing` values when testing for emptiness # Tests + Formatting - Add 2 tests - clippy OK - fmt OK # After Submitting
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
use nu_protocol::{ListStream, Signals};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Default;
|
||||
@ -146,6 +147,20 @@ fn default(
|
||||
&& matches!(input, PipelineData::Value(ref value, _) if value.is_empty()))
|
||||
{
|
||||
Ok(value.into_pipeline_data())
|
||||
} else if default_when_empty && matches!(input, PipelineData::ListStream(..)) {
|
||||
let PipelineData::ListStream(ls, metadata) = input else {
|
||||
unreachable!()
|
||||
};
|
||||
let span = ls.span();
|
||||
let mut stream = ls.into_inner().peekable();
|
||||
if stream.peek().is_none() {
|
||||
return Ok(value.into_pipeline_data());
|
||||
}
|
||||
|
||||
// stream's internal state already preserves the original signals config, so if this
|
||||
// Signals::empty list stream gets interrupted it will be caught by the underlying iterator
|
||||
let ls = ListStream::new(stream, span, Signals::empty());
|
||||
Ok(PipelineData::ListStream(ls, metadata))
|
||||
} else {
|
||||
Ok(input)
|
||||
}
|
||||
|
Reference in New Issue
Block a user