mirror of
https://github.com/nushell/nushell
synced 2024-12-29 14:33:13 +00:00
Add binary support to 'skip' (#4588)
* Add binary support to 'skip' * add streaming
This commit is contained in:
parent
6670b77b27
commit
24fc9c657e
1 changed files with 54 additions and 7 deletions
|
@ -4,8 +4,8 @@ use nu_engine::CallExt;
|
||||||
use nu_protocol::{
|
use nu_protocol::{
|
||||||
ast::Call,
|
ast::Call,
|
||||||
engine::{Command, EngineState, Stack},
|
engine::{Command, EngineState, Stack},
|
||||||
Category, Example, IntoInterruptiblePipelineData, PipelineData, ShellError, Signature, Span,
|
Category, Example, IntoInterruptiblePipelineData, IntoPipelineData, PipelineData, ShellError,
|
||||||
SyntaxShape, Value,
|
Signature, Span, SyntaxShape, Value,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
@ -75,11 +75,58 @@ impl Command for Skip {
|
||||||
|
|
||||||
let ctrlc = engine_state.ctrlc.clone();
|
let ctrlc = engine_state.ctrlc.clone();
|
||||||
|
|
||||||
Ok(input
|
match input {
|
||||||
.into_iter()
|
PipelineData::RawStream(stream, bytes_span, metadata) => {
|
||||||
.skip(n)
|
let mut remaining = n;
|
||||||
.into_pipeline_data(ctrlc)
|
let mut output = vec![];
|
||||||
.set_metadata(metadata))
|
|
||||||
|
for frame in stream {
|
||||||
|
let frame = frame?;
|
||||||
|
|
||||||
|
match frame {
|
||||||
|
Value::String { val, .. } => {
|
||||||
|
let bytes = val.as_bytes();
|
||||||
|
if bytes.len() < remaining {
|
||||||
|
remaining -= bytes.len();
|
||||||
|
output.extend_from_slice(bytes)
|
||||||
|
} else {
|
||||||
|
output.extend_from_slice(&bytes[0..remaining]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Value::Binary { val: bytes, .. } => {
|
||||||
|
if bytes.len() < remaining {
|
||||||
|
remaining -= bytes.len();
|
||||||
|
output.extend_from_slice(&bytes)
|
||||||
|
} else {
|
||||||
|
output.extend_from_slice(&bytes[0..remaining]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => unreachable!("Raw streams are either bytes or strings"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Value::Binary {
|
||||||
|
val: output,
|
||||||
|
span: bytes_span,
|
||||||
|
}
|
||||||
|
.into_pipeline_data()
|
||||||
|
.set_metadata(metadata))
|
||||||
|
}
|
||||||
|
PipelineData::Value(Value::Binary { val, span }, metadata) => {
|
||||||
|
let bytes = val.into_iter().skip(n).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
Ok(Value::Binary { val: bytes, span }
|
||||||
|
.into_pipeline_data()
|
||||||
|
.set_metadata(metadata))
|
||||||
|
}
|
||||||
|
_ => Ok(input
|
||||||
|
.into_iter()
|
||||||
|
.skip(n)
|
||||||
|
.into_pipeline_data(ctrlc)
|
||||||
|
.set_metadata(metadata)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue