Make errors emit first

This commit is contained in:
JT 2021-10-12 06:35:40 +13:00
parent acb0360180
commit 0504a7a776
3 changed files with 21 additions and 9 deletions

View file

@ -25,11 +25,11 @@
- [x] Modules and imports - [x] Modules and imports
- [x] Exports - [x] Exports
- [x] Source - [x] Source
- [x] Error shortcircuit (stopping on first error). Revised: errors emit first, but can be seen by commands.
- [ ] Input/output types - [ ] Input/output types
- [ ] Support for `$in` - [ ] Support for `$in`
- [ ] Value serialization - [ ] Value serialization
- [ ] Handling rows with missing columns during a cell path - [ ] Handling rows with missing columns during a cell path
- [ ] Error shortcircuit (stopping on first error)
- [ ] ctrl-c support - [ ] ctrl-c support
- [ ] operator overflow - [ ] operator overflow
- [ ] finish operator type-checking - [ ] finish operator type-checking

View file

@ -1,6 +1,6 @@
use nu_protocol::ast::{Call, PathMember}; use nu_protocol::ast::{Call, PathMember};
use nu_protocol::engine::{Command, EvaluationContext}; use nu_protocol::engine::{Command, EvaluationContext};
use nu_protocol::{Signature, Span, Value}; use nu_protocol::{ShellError, Signature, Span, Value};
use nu_table::StyledString; use nu_table::StyledString;
use std::collections::HashMap; use std::collections::HashMap;
use terminal_size::{Height, Width}; use terminal_size::{Height, Width};
@ -35,7 +35,7 @@ impl Command for Table {
match input { match input {
Value::List { vals, .. } => { Value::List { vals, .. } => {
let table = convert_to_table(vals); let table = convert_to_table(vals)?;
if let Some(table) = table { if let Some(table) = table {
let result = nu_table::draw_table(&table, term_width, &HashMap::new()); let result = nu_table::draw_table(&table, term_width, &HashMap::new());
@ -49,7 +49,7 @@ impl Command for Table {
} }
} }
Value::Stream { stream, .. } => { Value::Stream { stream, .. } => {
let table = convert_to_table(stream); let table = convert_to_table(stream)?;
if let Some(table) = table { if let Some(table) = table {
let result = nu_table::draw_table(&table, term_width, &HashMap::new()); let result = nu_table::draw_table(&table, term_width, &HashMap::new());
@ -96,7 +96,9 @@ impl Command for Table {
} }
} }
fn convert_to_table(iter: impl IntoIterator<Item = Value>) -> Option<nu_table::Table> { fn convert_to_table(
iter: impl IntoIterator<Item = Value>,
) -> Result<Option<nu_table::Table>, ShellError> {
let mut iter = iter.into_iter().peekable(); let mut iter = iter.into_iter().peekable();
if let Some(first) = iter.peek() { if let Some(first) = iter.peek() {
@ -109,6 +111,9 @@ fn convert_to_table(iter: impl IntoIterator<Item = Value>) -> Option<nu_table::T
let mut data = vec![]; let mut data = vec![];
for (row_num, item) in iter.enumerate() { for (row_num, item) in iter.enumerate() {
if let Value::Error { error } = item {
return Err(error);
}
let mut row = vec![row_num.to_string()]; let mut row = vec![row_num.to_string()];
if headers.is_empty() { if headers.is_empty() {
@ -135,7 +140,7 @@ fn convert_to_table(iter: impl IntoIterator<Item = Value>) -> Option<nu_table::T
data.push(row); data.push(row);
} }
Some(nu_table::Table { Ok(Some(nu_table::Table {
headers: headers headers: headers
.into_iter() .into_iter()
.map(|x| StyledString { .map(|x| StyledString {
@ -165,8 +170,8 @@ fn convert_to_table(iter: impl IntoIterator<Item = Value>) -> Option<nu_table::T
}) })
.collect(), .collect(),
theme: nu_table::Theme::rounded(), theme: nu_table::Theme::rounded(),
}) }))
} else { } else {
None Ok(None)
} }
} }

View file

@ -148,7 +148,14 @@ fn main() -> Result<()> {
}; };
match eval_block(&state, &block, Value::nothing()) { match eval_block(&state, &block, Value::nothing()) {
Ok(value) => print_value(value, &state)?, Ok(value) => {
if let Err(err) = print_value(value, &state) {
let engine_state = engine_state.borrow();
let working_set = StateWorkingSet::new(&*engine_state);
report_error(&working_set, &err);
}
}
Err(err) => { Err(err) => {
let engine_state = engine_state.borrow(); let engine_state = engine_state.borrow();
let working_set = StateWorkingSet::new(&*engine_state); let working_set = StateWorkingSet::new(&*engine_state);