let a simple last be a single value (#5060)

This commit is contained in:
JT 2022-04-01 23:12:31 +13:00 committed by GitHub
parent 9beecff736
commit 4bb95a880f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 16 deletions

View File

@ -3,8 +3,8 @@ use nu_engine::CallExt;
use nu_protocol::ast::Call; use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::engine::{Command, EngineState, Stack};
use nu_protocol::{ use nu_protocol::{
Category, Example, IntoInterruptiblePipelineData, PipelineData, ShellError, Signature, Span, Category, Example, IntoInterruptiblePipelineData, IntoPipelineData, PipelineData, ShellError,
SyntaxShape, Value, Signature, Span, SyntaxShape, Value,
}; };
#[derive(Clone)] #[derive(Clone)]
@ -30,14 +30,21 @@ impl Command for Last {
} }
fn examples(&self) -> Vec<Example> { fn examples(&self) -> Vec<Example> {
vec![Example { vec![
example: "[1,2,3] | last 2", Example {
description: "Get the last 2 items", example: "[1,2,3] | last 2",
result: Some(Value::List { description: "Get the last 2 items",
vals: vec![Value::test_int(2), Value::test_int(3)], result: Some(Value::List {
span: Span::test_data(), vals: vec![Value::test_int(2), Value::test_int(3)],
}), span: Span::test_data(),
}] }),
},
Example {
example: "[1,2,3] | last",
description: "Get the last item",
result: Some(Value::test_int(3)),
},
]
} }
fn run( fn run(
@ -48,17 +55,28 @@ impl Command for Last {
input: PipelineData, input: PipelineData,
) -> Result<PipelineData, ShellError> { ) -> Result<PipelineData, ShellError> {
let metadata = input.metadata(); let metadata = input.metadata();
let span = call.head;
let rows: Option<i64> = call.opt(engine_state, stack, 0)?; let rows: Option<i64> = call.opt(engine_state, stack, 0)?;
let v: Vec<_> = input.into_iter().collect(); let v: Vec<_> = input.into_iter().collect();
let vlen: i64 = v.len() as i64; let vlen: i64 = v.len() as i64;
let beginning_rows_to_skip = rows_to_skip(vlen, rows); let beginning_rows_to_skip = rows_to_skip(vlen, rows);
let iter = v.into_iter().skip(beginning_rows_to_skip as usize); if rows.is_some() {
let iter = v.into_iter().skip(beginning_rows_to_skip as usize);
Ok(iter Ok(iter
.into_pipeline_data(engine_state.ctrlc.clone()) .into_pipeline_data(engine_state.ctrlc.clone())
.set_metadata(metadata)) .set_metadata(metadata))
} else {
let last = v.into_iter().nth(beginning_rows_to_skip as usize);
if let Some(last) = last {
Ok(last.into_pipeline_data().set_metadata(metadata))
} else {
Ok(PipelineData::new(span).set_metadata(metadata))
}
}
} }
} }

View File

@ -20,7 +20,6 @@ fn splits_correctly_single_path() {
'home/viking/spam.txt' 'home/viking/spam.txt'
| path split | path split
| last | last
| get 0
"# "#
)); ));

View File

@ -44,7 +44,7 @@ fn flatten_table_get() -> TestResult {
#[test] #[test]
fn flatten_table_column_get_last() -> TestResult { fn flatten_table_column_get_last() -> TestResult {
run_test( run_test(
"[[origin, crate, versions]; [World, ([[name]; ['nu-cli']]), ['0.21', '0.22']]] | flatten versions | last | get versions.0", "[[origin, crate, versions]; [World, ([[name]; ['nu-cli']]), ['0.21', '0.22']]] | flatten versions | last | get versions",
"0.22", "0.22",
) )
} }