Port default command (#848)

This commit is contained in:
JT 2022-01-25 10:02:15 -05:00 committed by GitHub
parent 1ca3e03578
commit 3023af66fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 0 deletions

View file

@ -57,6 +57,7 @@ pub fn create_default_context(cwd: impl AsRef<Path>) -> EngineState {
Collect, Collect,
Columns, Columns,
Compact, Compact,
Default,
Drop, Drop,
DropColumn, DropColumn,
DropNth, DropNth,

View file

@ -0,0 +1,100 @@
use nu_engine::CallExt;
use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack};
use nu_protocol::{Category, Example, PipelineData, Signature, Spanned, SyntaxShape, Value};
#[derive(Clone)]
pub struct Default;
impl Command for Default {
fn name(&self) -> &str {
"default"
}
fn signature(&self) -> Signature {
Signature::build("default")
.required("column name", SyntaxShape::String, "the name of the column")
.required(
"column value",
SyntaxShape::Any,
"the value of the column to default",
)
.category(Category::Filters)
}
fn usage(&self) -> &str {
"Sets a default row's column if missing."
}
fn run(
&self,
engine_state: &EngineState,
stack: &mut Stack,
call: &Call,
input: PipelineData,
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
default(engine_state, stack, call, input)
}
fn examples(&self) -> Vec<Example> {
vec![Example {
description: "Give a default 'target' to all file entries",
example: "ls -la | default target 'nothing'",
result: None,
}]
}
}
fn default(
engine_state: &EngineState,
stack: &mut Stack,
call: &Call,
input: PipelineData,
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
let column: Spanned<String> = call.req(engine_state, stack, 0)?;
let value: Value = call.req(engine_state, stack, 1)?;
let ctrlc = engine_state.ctrlc.clone();
input.map(
move |item| match item {
Value::Record {
mut cols,
mut vals,
span,
} => {
let mut idx = 0;
let mut found = false;
while idx < cols.len() {
if cols[idx] == column.item && matches!(vals[idx], Value::Nothing { .. }) {
vals[idx] = value.clone();
found = true;
}
idx += 1;
}
if !found {
cols.push(column.item.clone());
vals.push(value.clone());
}
Value::Record { cols, vals, span }
}
_ => item,
},
ctrlc,
)
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_examples() {
use crate::test_examples;
test_examples(Default {})
}
}

View file

@ -4,6 +4,7 @@ mod append;
mod collect; mod collect;
mod columns; mod columns;
mod compact; mod compact;
mod default;
mod drop; mod drop;
mod each; mod each;
mod empty; mod empty;
@ -43,6 +44,7 @@ pub use append::Append;
pub use collect::Collect; pub use collect::Collect;
pub use columns::Columns; pub use columns::Columns;
pub use compact::Compact; pub use compact::Compact;
pub use default::Default;
pub use drop::*; pub use drop::*;
pub use each::Each; pub use each::Each;
pub use empty::Empty; pub use empty::Empty;