mirror of
https://github.com/nushell/nushell.git
synced 2024-11-25 18:03:51 +01:00
Allow folding with tables. (#2538)
This commit is contained in:
parent
dcfa135ab9
commit
7528094e12
@ -50,9 +50,16 @@ async fn is_empty(
|
|||||||
args: CommandArgs,
|
args: CommandArgs,
|
||||||
registry: &CommandRegistry,
|
registry: &CommandRegistry,
|
||||||
) -> Result<OutputStream, ShellError> {
|
) -> Result<OutputStream, ShellError> {
|
||||||
|
let name_tag = args.call_info.name_tag.clone();
|
||||||
let registry = registry.clone();
|
let registry = registry.clone();
|
||||||
let (IsEmptyArgs { rest }, input) = args.process(®istry).await?;
|
let (IsEmptyArgs { rest }, input) = args.process(®istry).await?;
|
||||||
|
|
||||||
|
if input.is_empty() {
|
||||||
|
return Ok(OutputStream::one(ReturnSuccess::value(
|
||||||
|
UntaggedValue::boolean(true).into_value(name_tag),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(input
|
Ok(input
|
||||||
.map(move |value| {
|
.map(move |value| {
|
||||||
let value_tag = value.tag();
|
let value_tag = value.tag();
|
||||||
@ -72,7 +79,6 @@ async fn is_empty(
|
|||||||
(_, _) => IsEmptyFor::Value,
|
(_, _) => IsEmptyFor::Value,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// let no_args = vec![];
|
|
||||||
let mut arguments = rest.iter().rev();
|
let mut arguments = rest.iter().rev();
|
||||||
let replacement_if_true = match arguments.next() {
|
let replacement_if_true = match arguments.next() {
|
||||||
Some(arg) => arg.clone(),
|
Some(arg) => arg.clone(),
|
||||||
|
@ -138,7 +138,19 @@ async fn reduce(
|
|||||||
let row = each::make_indexed_item(input.0 + ioffset, input.1);
|
let row = each::make_indexed_item(input.0 + ioffset, input.1);
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let f = acc?.into_vec().await[0].clone();
|
let values = acc?.drain_vec().await;
|
||||||
|
|
||||||
|
let f = if values.len() == 1 {
|
||||||
|
let value = values
|
||||||
|
.get(0)
|
||||||
|
.ok_or_else(|| ShellError::unexpected("No value to update with"))?;
|
||||||
|
value.clone()
|
||||||
|
} else if values.is_empty() {
|
||||||
|
UntaggedValue::nothing().into_untagged_value()
|
||||||
|
} else {
|
||||||
|
UntaggedValue::table(&values).into_untagged_value()
|
||||||
|
};
|
||||||
|
|
||||||
scope.vars.insert(String::from("$acc"), f);
|
scope.vars.insert(String::from("$acc"), f);
|
||||||
process_row(block, Arc::new(scope), context, row).await
|
process_row(block, Arc::new(scope), context, row).await
|
||||||
}
|
}
|
||||||
@ -154,9 +166,20 @@ async fn reduce(
|
|||||||
let context = Arc::clone(&context);
|
let context = Arc::clone(&context);
|
||||||
|
|
||||||
async {
|
async {
|
||||||
scope
|
let values = acc?.drain_vec().await;
|
||||||
.vars
|
|
||||||
.insert(String::from("$acc"), acc?.into_vec().await[0].clone());
|
let f = if values.len() == 1 {
|
||||||
|
let value = values
|
||||||
|
.get(0)
|
||||||
|
.ok_or_else(|| ShellError::unexpected("No value to update with"))?;
|
||||||
|
value.clone()
|
||||||
|
} else if values.is_empty() {
|
||||||
|
UntaggedValue::nothing().into_untagged_value()
|
||||||
|
} else {
|
||||||
|
UntaggedValue::table(&values).into_untagged_value()
|
||||||
|
};
|
||||||
|
|
||||||
|
scope.vars.insert(String::from("$acc"), f);
|
||||||
process_row(block, Arc::new(scope), context, row).await
|
process_row(block, Arc::new(scope), context, row).await
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -40,8 +40,7 @@ fn adds_value_provided_for_columns_that_are_empty() {
|
|||||||
[
|
[
|
||||||
{"boost": 1, "check": []},
|
{"boost": 1, "check": []},
|
||||||
{"boost": 1, "check": ""},
|
{"boost": 1, "check": ""},
|
||||||
{"boost": 1, "check": {}},
|
{"boost": 1, "check": {}}
|
||||||
{"boost": null, "check": ["" {} [] ""]}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
"#,
|
"#,
|
||||||
@ -58,7 +57,7 @@ fn adds_value_provided_for_columns_that_are_empty() {
|
|||||||
"#
|
"#
|
||||||
));
|
));
|
||||||
|
|
||||||
assert_eq!(actual.out, "8");
|
assert_eq!(actual.out, "6");
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,8 +71,7 @@ fn value_emptiness_check() {
|
|||||||
"are_empty": [
|
"are_empty": [
|
||||||
{"check": []},
|
{"check": []},
|
||||||
{"check": ""},
|
{"check": ""},
|
||||||
{"check": {}},
|
{"check": {}}
|
||||||
{"check": ["" {} [] ""]}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
@ -91,6 +89,6 @@ fn value_emptiness_check() {
|
|||||||
"#
|
"#
|
||||||
));
|
));
|
||||||
|
|
||||||
assert_eq!(actual.out, "4");
|
assert_eq!(actual.out, "3");
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,26 @@ fn reduce_numbered_example() {
|
|||||||
assert_eq!(actual.out, "1");
|
assert_eq!(actual.out, "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn folding_with_tables() {
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: ".", pipeline(
|
||||||
|
r#"
|
||||||
|
echo [10 20 30 40]
|
||||||
|
| reduce -f [] {
|
||||||
|
with-env [value $it] {
|
||||||
|
echo $acc | append $(= 10 * $(= $nu.env.value | str to-int))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| math sum
|
||||||
|
| echo $it
|
||||||
|
"#
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(actual.out, "1000");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn error_reduce_fold_type_mismatch() {
|
fn error_reduce_fold_type_mismatch() {
|
||||||
let actual = nu!(
|
let actual = nu!(
|
||||||
|
@ -385,12 +385,10 @@ impl Value {
|
|||||||
value: UntaggedValue::Primitive(p),
|
value: UntaggedValue::Primitive(p),
|
||||||
..
|
..
|
||||||
} => p.is_empty(),
|
} => p.is_empty(),
|
||||||
t
|
|
||||||
@
|
|
||||||
Value {
|
Value {
|
||||||
value: UntaggedValue::Table(_),
|
value: UntaggedValue::Table(rows),
|
||||||
..
|
..
|
||||||
} => t.table_entries().all(|row| row.is_empty()),
|
} => rows.is_empty(),
|
||||||
r
|
r
|
||||||
@
|
@
|
||||||
Value {
|
Value {
|
||||||
|
Loading…
Reference in New Issue
Block a user