More 'did you mean?' errors

This commit is contained in:
Jonathan Turner 2019-09-24 08:24:51 +12:00
parent f99d38ead4
commit c720cc00e3
2 changed files with 15 additions and 23 deletions

View File

@ -12,20 +12,6 @@ pub enum Description {
Synthetic(String),
}
impl Description {
pub fn from(value: Tagged<impl Into<String>>) -> Description {
let value_tag = value.tag();
match value_tag {
Tag {
span: crate::data::meta::Span { start: 0, end: 0 },
..
} => Description::Synthetic(value.item.into()),
_ => Description::Source(Tagged::from_item(value.item.into(), value_tag)),
}
}
}
impl Description {
fn into_label(self) -> Result<Label<Tag>, String> {
match self {
@ -114,10 +100,6 @@ impl ShellError {
.start()
}
pub(crate) fn missing_property(subpath: Description, expr: Description) -> ShellError {
ProximateShellError::MissingProperty { subpath, expr }.start()
}
pub(crate) fn missing_value(tag: Option<Tag>, reason: impl Into<String>) -> ShellError {
ProximateShellError::MissingValue {
tag,

View File

@ -1,5 +1,5 @@
use crate::data::base::Block;
use crate::errors::{ArgumentError, Description};
use crate::errors::ArgumentError;
use crate::parser::{
hir::{self, Expression, RawExpression},
CommandRegistry, Text,
@ -87,10 +87,20 @@ pub(crate) fn evaluate_baseline_expr(
match next {
None => {
return Err(ShellError::missing_property(
Description::from(item.tagged_type_name()),
Description::from(name.clone()),
))
let possibilities = item.data_descriptors();
let mut possible_matches: Vec<_> = possibilities
.iter()
.map(|x| (natural::distance::levenshtein_distance(x, &name), x))
.collect();
possible_matches.sort();
return Err(ShellError::labeled_error(
"Unknown column",
format!("did you mean '{}'?", possible_matches[0].1),
expr.tag(),
));
}
Some(next) => {
item = next.clone().item.tagged(expr.tag());