mirror of
https://github.com/nushell/nushell.git
synced 2025-05-31 07:08:22 +02:00
let a simple last be a single value (#5060)
This commit is contained in:
parent
9beecff736
commit
4bb95a880f
@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
"#
|
"#
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -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",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user