mirror of
https://github.com/nushell/nushell
synced 2024-12-27 05:23:11 +00:00
default command introduced.
This commit is contained in:
parent
a74145961e
commit
1c830b5c95
5 changed files with 108 additions and 0 deletions
|
@ -270,6 +270,7 @@ Nu adheres closely to a set of goals that make up its design philosophy. As feat
|
||||||
| append row-data | Append a row to the end of the table |
|
| append row-data | Append a row to the end of the table |
|
||||||
| compact ...columns | Remove rows where given columns are empty |
|
| compact ...columns | Remove rows where given columns are empty |
|
||||||
| count | Show the total number of rows |
|
| count | Show the total number of rows |
|
||||||
|
| default column row-data | Sets a default row's column if missing |
|
||||||
| edit column-or-column-path value | Edit an existing column to have a new value |
|
| edit column-or-column-path value | Edit an existing column to have a new value |
|
||||||
| embed column | Creates a new table of one column with the given name, and places the current table inside of it |
|
| embed column | Creates a new table of one column with the given name, and places the current table inside of it |
|
||||||
| first amount | Show only the first number of rows |
|
| first amount | Show only the first number of rows |
|
||||||
|
|
|
@ -310,6 +310,7 @@ pub async fn cli() -> Result<(), Box<dyn Error>> {
|
||||||
per_item_command(Echo),
|
per_item_command(Echo),
|
||||||
whole_stream_command(Config),
|
whole_stream_command(Config),
|
||||||
whole_stream_command(Compact),
|
whole_stream_command(Compact),
|
||||||
|
whole_stream_command(Default),
|
||||||
whole_stream_command(SkipWhile),
|
whole_stream_command(SkipWhile),
|
||||||
per_item_command(Enter),
|
per_item_command(Enter),
|
||||||
per_item_command(Help),
|
per_item_command(Help),
|
||||||
|
|
|
@ -17,6 +17,7 @@ pub(crate) mod count;
|
||||||
pub(crate) mod cp;
|
pub(crate) mod cp;
|
||||||
pub(crate) mod date;
|
pub(crate) mod date;
|
||||||
pub(crate) mod debug;
|
pub(crate) mod debug;
|
||||||
|
pub(crate) mod default;
|
||||||
pub(crate) mod echo;
|
pub(crate) mod echo;
|
||||||
pub(crate) mod enter;
|
pub(crate) mod enter;
|
||||||
pub(crate) mod env;
|
pub(crate) mod env;
|
||||||
|
@ -105,6 +106,7 @@ pub(crate) use count::Count;
|
||||||
pub(crate) use cp::Cpy;
|
pub(crate) use cp::Cpy;
|
||||||
pub(crate) use date::Date;
|
pub(crate) use date::Date;
|
||||||
pub(crate) use debug::Debug;
|
pub(crate) use debug::Debug;
|
||||||
|
pub(crate) use default::Default;
|
||||||
pub(crate) use echo::Echo;
|
pub(crate) use echo::Echo;
|
||||||
pub(crate) use enter::Enter;
|
pub(crate) use enter::Enter;
|
||||||
pub(crate) use env::Env;
|
pub(crate) use env::Env;
|
||||||
|
|
72
src/commands/default.rs
Normal file
72
src/commands/default.rs
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
use crate::commands::WholeStreamCommand;
|
||||||
|
use crate::errors::ShellError;
|
||||||
|
use crate::parser::CommandRegistry;
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct DefaultArgs {
|
||||||
|
column: Tagged<String>,
|
||||||
|
value: Tagged<Value>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Default;
|
||||||
|
|
||||||
|
impl WholeStreamCommand 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",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn usage(&self) -> &str {
|
||||||
|
"Sets a default row's column if missing."
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run(
|
||||||
|
&self,
|
||||||
|
args: CommandArgs,
|
||||||
|
registry: &CommandRegistry,
|
||||||
|
) -> Result<OutputStream, ShellError> {
|
||||||
|
args.process(registry, default)?.run()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn default(
|
||||||
|
DefaultArgs { column, value }: DefaultArgs,
|
||||||
|
RunnableContext { input, .. }: RunnableContext,
|
||||||
|
) -> Result<OutputStream, ShellError> {
|
||||||
|
let stream = input
|
||||||
|
.values
|
||||||
|
.map(move |item| {
|
||||||
|
let mut result = VecDeque::new();
|
||||||
|
|
||||||
|
let should_add = match item {
|
||||||
|
Tagged {
|
||||||
|
item: Value::Row(ref r),
|
||||||
|
..
|
||||||
|
} => r.get_data(&column.item).borrow().is_none(),
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
|
if should_add {
|
||||||
|
match item.insert_data_at_path(&column.item, value.item.clone()) {
|
||||||
|
Some(new_value) => result.push_back(ReturnSuccess::value(new_value)),
|
||||||
|
None => {}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.push_back(ReturnSuccess::value(item));
|
||||||
|
}
|
||||||
|
result
|
||||||
|
})
|
||||||
|
.flatten();
|
||||||
|
|
||||||
|
Ok(stream.to_output_stream())
|
||||||
|
}
|
|
@ -3,6 +3,38 @@ mod helpers;
|
||||||
use helpers as h;
|
use helpers as h;
|
||||||
use helpers::{Playground, Stub::*};
|
use helpers::{Playground, Stub::*};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn default() {
|
||||||
|
Playground::setup("default_test_1", |dirs, sandbox| {
|
||||||
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
||||||
|
"los_tres_amigos.json",
|
||||||
|
r#"
|
||||||
|
{
|
||||||
|
"amigos": [
|
||||||
|
{"name": "Yehuda"},
|
||||||
|
{"name": "Jonathan", "rusty_luck": 0},
|
||||||
|
{"name": "Andres", "rusty_luck": 0},
|
||||||
|
{"name":"GorbyPuff"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)]);
|
||||||
|
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: dirs.test(), h::pipeline(
|
||||||
|
r#"
|
||||||
|
open los_tres_amigos.json
|
||||||
|
| get amigos
|
||||||
|
| default rusty_luck 1
|
||||||
|
| get rusty_luck
|
||||||
|
| sum
|
||||||
|
| echo $it
|
||||||
|
"#
|
||||||
|
));
|
||||||
|
|
||||||
|
assert_eq!(actual, "2");
|
||||||
|
});
|
||||||
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn compact_rows_where_given_column_is_empty() {
|
fn compact_rows_where_given_column_is_empty() {
|
||||||
Playground::setup("compact_test_1", |dirs, sandbox| {
|
Playground::setup("compact_test_1", |dirs, sandbox| {
|
||||||
|
|
Loading…
Reference in a new issue