From 72cf57dd9917b7ed1fb9feadd4fd601c3a9eb0d6 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Tue, 21 Apr 2020 12:30:01 +1200 Subject: [PATCH] Add booleans and fix semicolon shortcircuit (#1620) --- crates/nu-cli/src/commands/classified/block.rs | 15 +++++++++++---- crates/nu-cli/src/context.rs | 4 ++++ crates/nu-cli/src/data/base.rs | 3 +++ crates/nu-cli/src/evaluate/evaluator.rs | 8 ++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/crates/nu-cli/src/commands/classified/block.rs b/crates/nu-cli/src/commands/classified/block.rs index fc40826d13..8694a7a50d 100644 --- a/crates/nu-cli/src/commands/classified/block.rs +++ b/crates/nu-cli/src/commands/classified/block.rs @@ -30,17 +30,24 @@ pub(crate) async fn run_block( .. }))) => return Err(e), Ok(Some(_item)) => { + if let Some(err) = ctx.get_errors().get(0) { + ctx.clear_errors(); + return Err(err.clone()); + } if ctx.ctrl_c.load(Ordering::SeqCst) { break; } } - Ok(None) => break, + Ok(None) => { + if let Some(err) = ctx.get_errors().get(0) { + ctx.clear_errors(); + return Err(err.clone()); + } + break; + } Err(e) => return Err(e), } } - if !ctx.get_errors().is_empty() { - return Ok(InputStream::empty()); - } } Err(e) => { return Err(e); diff --git a/crates/nu-cli/src/context.rs b/crates/nu-cli/src/context.rs index d1d97f03cb..ed038b93a1 100644 --- a/crates/nu-cli/src/context.rs +++ b/crates/nu-cli/src/context.rs @@ -147,6 +147,10 @@ impl Context { self.with_errors(|errors| errors.push(error)) } + pub(crate) fn clear_errors(&mut self) { + self.current_errors.lock().clear() + } + pub(crate) fn get_errors(&self) -> Vec { self.current_errors.lock().clone() } diff --git a/crates/nu-cli/src/data/base.rs b/crates/nu-cli/src/data/base.rs index fdf35d7858..58c110fb75 100644 --- a/crates/nu-cli/src/data/base.rs +++ b/crates/nu-cli/src/data/base.rs @@ -88,6 +88,7 @@ pub(crate) enum CompareValues { String(String, String), Date(DateTime, DateTime), DateDuration(DateTime, i64), + Booleans(bool, bool), } impl CompareValues { @@ -108,6 +109,7 @@ impl CompareValues { }; right.cmp(left) } + CompareValues::Booleans(left, right) => left.cmp(right), } } } @@ -164,6 +166,7 @@ fn coerce_compare_primitive( (Line(left), Line(right)) => CompareValues::String(left.clone(), right.clone()), (Date(left), Date(right)) => CompareValues::Date(*left, *right), (Date(left), Duration(right)) => CompareValues::DateDuration(*left, *right), + (Boolean(left), Boolean(right)) => CompareValues::Booleans(*left, *right), _ => return Err((left.type_name(), right.type_name())), }) } diff --git a/crates/nu-cli/src/evaluate/evaluator.rs b/crates/nu-cli/src/evaluate/evaluator.rs index 7668c4ec2c..242bbbddec 100644 --- a/crates/nu-cli/src/evaluate/evaluator.rs +++ b/crates/nu-cli/src/evaluate/evaluator.rs @@ -152,6 +152,14 @@ fn evaluate_reference(name: &hir::Variable, scope: &Scope, tag: Tag) -> Result Ok(scope.it.value.clone().into_value(tag)), hir::Variable::Other(name, _) => match name { x if x == "$nu" => crate::evaluate::variables::nu(tag), + x if x == "$true" => Ok(Value { + value: UntaggedValue::boolean(true), + tag, + }), + x if x == "$false" => Ok(Value { + value: UntaggedValue::boolean(false), + tag, + }), x => Ok(scope .vars .get(x)