mirror of
https://github.com/nushell/nushell
synced 2024-12-29 14:33:13 +00:00
Make errors emit first
This commit is contained in:
parent
acb0360180
commit
0504a7a776
3 changed files with 21 additions and 9 deletions
2
TODO.md
2
TODO.md
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue