mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 07:05:47 +02:00
--no-edit
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
use crate::data::base::Block;
|
||||
use crate::errors::ArgumentError;
|
||||
use crate::parser::hir::path::{ColumnPath, RawPathMember};
|
||||
use crate::parser::{
|
||||
hir::{self, Expression, RawExpression},
|
||||
CommandRegistry, Text,
|
||||
@ -62,9 +63,8 @@ pub(crate) fn evaluate_baseline_expr(
|
||||
match &expr.item {
|
||||
RawExpression::Literal(literal) => Ok(evaluate_literal(literal.tagged(tag), source)),
|
||||
RawExpression::ExternalWord => Err(ShellError::argument_error(
|
||||
"Invalid external word",
|
||||
"Invalid external word".spanned(tag.span),
|
||||
ArgumentError::InvalidExternalWord,
|
||||
tag,
|
||||
)),
|
||||
RawExpression::FilePath(path) => Ok(Value::path(path.clone()).tagged(tag)),
|
||||
RawExpression::Synthetic(hir::Synthetic::String(s)) => {
|
||||
@ -82,14 +82,8 @@ pub(crate) fn evaluate_baseline_expr(
|
||||
match left.compare(binary.op(), &*right) {
|
||||
Ok(result) => Ok(Value::boolean(result).tagged(tag)),
|
||||
Err((left_type, right_type)) => Err(ShellError::coerce_error(
|
||||
left_type.tagged(Tag {
|
||||
span: binary.left().span,
|
||||
anchor: None,
|
||||
}),
|
||||
right_type.tagged(Tag {
|
||||
span: binary.right().span,
|
||||
anchor: None,
|
||||
}),
|
||||
left_type.spanned(binary.left().span),
|
||||
right_type.spanned(binary.right().span),
|
||||
)),
|
||||
}
|
||||
}
|
||||
@ -110,35 +104,33 @@ pub(crate) fn evaluate_baseline_expr(
|
||||
let value = evaluate_baseline_expr(path.head(), registry, scope, source)?;
|
||||
let mut item = value;
|
||||
|
||||
for name in path.tail() {
|
||||
let next = item.get_data_by_key(name);
|
||||
for member in path.tail() {
|
||||
let next = item.get_data_by_member(member);
|
||||
|
||||
match next {
|
||||
None => {
|
||||
Err(err) => {
|
||||
let possibilities = item.data_descriptors();
|
||||
|
||||
let mut possible_matches: Vec<_> = possibilities
|
||||
.iter()
|
||||
.map(|x| (natural::distance::levenshtein_distance(x, &name), x))
|
||||
.collect();
|
||||
if let RawPathMember::String(name) = &member.item {
|
||||
let mut possible_matches: Vec<_> = possibilities
|
||||
.iter()
|
||||
.map(|x| (natural::distance::levenshtein_distance(x, &name), x))
|
||||
.collect();
|
||||
|
||||
possible_matches.sort();
|
||||
possible_matches.sort();
|
||||
|
||||
if possible_matches.len() > 0 {
|
||||
return Err(ShellError::labeled_error(
|
||||
"Unknown column",
|
||||
format!("did you mean '{}'?", possible_matches[0].1),
|
||||
&tag,
|
||||
));
|
||||
} else {
|
||||
return Err(ShellError::labeled_error(
|
||||
"Unknown column",
|
||||
"row does not have this column",
|
||||
&tag,
|
||||
));
|
||||
if possible_matches.len() > 0 {
|
||||
return Err(ShellError::labeled_error(
|
||||
"Unknown column",
|
||||
format!("did you mean '{}'?", possible_matches[0].1),
|
||||
&tag,
|
||||
));
|
||||
} else {
|
||||
return Err(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
Some(next) => {
|
||||
Ok(next) => {
|
||||
item = next.clone().item.tagged(&tag);
|
||||
}
|
||||
};
|
||||
@ -152,6 +144,14 @@ pub(crate) fn evaluate_baseline_expr(
|
||||
|
||||
fn evaluate_literal(literal: Tagged<&hir::Literal>, source: &Text) -> Tagged<Value> {
|
||||
let result = match literal.item {
|
||||
hir::Literal::ColumnPath(path) => {
|
||||
let members = path
|
||||
.iter()
|
||||
.map(|member| member.to_path_member(source))
|
||||
.collect();
|
||||
|
||||
Value::Primitive(Primitive::ColumnPath(ColumnPath::new(members)))
|
||||
}
|
||||
hir::Literal::Number(int) => int.into(),
|
||||
hir::Literal::Size(int, unit) => unit.compute(int),
|
||||
hir::Literal::String(tag) => Value::string(tag.slice(source)),
|
||||
@ -212,10 +212,12 @@ fn evaluate_external(
|
||||
_source: &Text,
|
||||
) -> Result<Tagged<Value>, ShellError> {
|
||||
Err(ShellError::syntax_error(
|
||||
"Unexpected external command".tagged(*external.name()),
|
||||
"Unexpected external command".spanned(*external.name()),
|
||||
))
|
||||
}
|
||||
|
||||
fn evaluate_command(tag: Tag, _scope: &Scope, _source: &Text) -> Result<Tagged<Value>, ShellError> {
|
||||
Err(ShellError::syntax_error("Unexpected command".tagged(tag)))
|
||||
Err(ShellError::syntax_error(
|
||||
"Unexpected command".spanned(tag.span),
|
||||
))
|
||||
}
|
||||
|
Reference in New Issue
Block a user