Use 'table' on scripts and -c commands (#4377)

* Use 'table' on scripts and -c commands

* Fix tests

* Oops, missed a spot
This commit is contained in:
JT
2022-02-09 05:58:54 -05:00
committed by GitHub
parent 659da3c4a4
commit f9e1c4ef50
27 changed files with 125 additions and 77 deletions

View File

@ -112,16 +112,7 @@ pub(crate) fn evaluate(
match eval_block(engine_state, &mut stack, &block, input) {
Ok(pipeline_data) => {
for item in pipeline_data {
if let Value::Error { error } = item {
let working_set = StateWorkingSet::new(engine_state);
report_error(&working_set, &error);
std::process::exit(1);
}
println!("{}", item.into_string("\n", &config));
}
crate::eval_file::print_table_or_error(engine_state, &mut stack, pipeline_data, &config)
}
Err(err) => {
let working_set = StateWorkingSet::new(engine_state);

View File

@ -3,10 +3,11 @@ use miette::{IntoDiagnostic, Result};
use nu_engine::{convert_env_values, eval_block};
use nu_parser::parse;
use nu_protocol::{
engine::{EngineState, StateDelta, StateWorkingSet},
ast::Call,
engine::{EngineState, Stack, StateDelta, StateWorkingSet},
Config, PipelineData, Span, Value, CONFIG_VARIABLE_ID,
};
use std::path::PathBuf;
use std::{io::Write, path::PathBuf};
use crate::utils::{gather_parent_env_vars, report_error};
@ -89,16 +90,7 @@ pub(crate) fn evaluate(
// We don't have a main, so evaluate the whole file
match eval_block(engine_state, &mut stack, &block, input) {
Ok(pipeline_data) => {
for item in pipeline_data {
if let Value::Error { error } = item {
let working_set = StateWorkingSet::new(engine_state);
report_error(&working_set, &error);
std::process::exit(1);
}
println!("{}", item.into_string("\n", &config));
}
print_table_or_error(engine_state, &mut stack, pipeline_data, &config)
}
Err(err) => {
let working_set = StateWorkingSet::new(engine_state);
@ -131,16 +123,7 @@ pub(crate) fn evaluate(
match eval_block(engine_state, &mut stack, &block, input) {
Ok(pipeline_data) => {
for item in pipeline_data {
if let Value::Error { error } = item {
let working_set = StateWorkingSet::new(engine_state);
report_error(&working_set, &error);
std::process::exit(1);
}
println!("{}", item.into_string("\n", &config));
}
print_table_or_error(engine_state, &mut stack, pipeline_data, &config)
}
Err(err) => {
let working_set = StateWorkingSet::new(engine_state);
@ -154,3 +137,73 @@ pub(crate) fn evaluate(
Ok(())
}
pub fn print_table_or_error(
engine_state: &EngineState,
stack: &mut Stack,
pipeline_data: PipelineData,
config: &Config,
) {
match engine_state.find_decl("table".as_bytes()) {
Some(decl_id) => {
let table = engine_state.get_decl(decl_id).run(
engine_state,
stack,
&Call::new(Span::new(0, 0)),
pipeline_data,
);
match table {
Ok(table) => {
for item in table {
let stdout = std::io::stdout();
if let Value::Error { error } = item {
let working_set = StateWorkingSet::new(engine_state);
report_error(&working_set, &error);
std::process::exit(1);
}
let mut out = item.into_string("\n", config);
out.push('\n');
match stdout.lock().write_all(out.as_bytes()) {
Ok(_) => (),
Err(err) => eprintln!("{}", err),
};
}
}
Err(error) => {
let working_set = StateWorkingSet::new(engine_state);
report_error(&working_set, &error);
std::process::exit(1);
}
}
}
None => {
for item in pipeline_data {
let stdout = std::io::stdout();
if let Value::Error { error } = item {
let working_set = StateWorkingSet::new(engine_state);
report_error(&working_set, &error);
std::process::exit(1);
}
let mut out = item.into_string("\n", config);
out.push('\n');
match stdout.lock().write_all(out.as_bytes()) {
Ok(_) => (),
Err(err) => eprintln!("{}", err),
};
}
}
};
}

View File

@ -22,7 +22,10 @@ fn cell_path_var2() -> TestResult {
#[test]
fn flatten_simple_list() -> TestResult {
run_test("[[N, u, s, h, e, l, l]] | flatten", "N\nu\ns\nh\ne\nl\nl")
run_test(
"[[N, u, s, h, e, l, l]] | flatten | str collect (char nl)",
"N\nu\ns\nh\ne\nl\nl",
)
}
#[test]
@ -33,7 +36,7 @@ fn flatten_get_simple_list() -> TestResult {
#[test]
fn flatten_table_get() -> TestResult {
run_test(
"[[origin, people]; [Ecuador, ([[name, meal]; ['Andres', 'arepa']])]] | flatten | get meal",
"[[origin, people]; [Ecuador, ([[name, meal]; ['Andres', 'arepa']])]] | flatten | get meal.0",
"arepa",
)
}
@ -41,7 +44,7 @@ fn flatten_table_get() -> TestResult {
#[test]
fn flatten_table_column_get_last() -> TestResult {
run_test(
"[[origin, crate, versions]; [World, ([[name]; ['nu-cli']]), ['0.21', '0.22']]] | flatten versions | last | get versions",
"[[origin, crate, versions]; [World, ([[name]; ['nu-cli']]), ['0.21', '0.22']]] | flatten versions | last | get versions.0",
"0.22",
)
}
@ -56,7 +59,7 @@ fn get_table_columns_1() -> TestResult {
#[test]
fn get_table_columns_2() -> TestResult {
run_test("[[name, age, grade]; [paul,21,a]] | columns | nth 1", "age")
run_test("[[name, age, grade]; [paul,21,a]] | columns | get 1", "age")
}
#[test]