Clarify more errors

This commit is contained in:
Mubelotix
2025-08-13 13:37:19 +02:00
parent b80869f2be
commit 8529e2161a
3 changed files with 31 additions and 6 deletions

View File

@ -162,7 +162,17 @@ fn parse_vectors(input: Span) -> IResult<(Token, Option<Token>, VectorFilter<'_>
let value = let value =
opt_value.as_ref().map(|v| v.value().to_owned()).unwrap_or_else(|| point.to_string()); opt_value.as_ref().map(|v| v.value().to_owned()).unwrap_or_else(|| point.to_string());
let context = opt_value.map(|v| v.original_span()).unwrap_or(point); let context = opt_value.map(|v| v.original_span()).unwrap_or(point);
return Err(Error::failure_from_kind(context, ErrorKind::VectorFilterUnknownSuffix(value))); let previous_kind = match filter {
VectorFilter::Fragment(_) => Some("fragments"),
VectorFilter::DocumentTemplate => Some("documentTemplate"),
VectorFilter::UserProvided => Some("userProvided"),
VectorFilter::Regenerate => Some("regenerate"),
VectorFilter::None => None,
};
return Err(Error::failure_from_kind(
context,
ErrorKind::VectorFilterUnknownSuffix(previous_kind, value),
));
} }
let (input, _) = multispace1(input).map_cut(ErrorKind::VectorFilterLeftover)?; let (input, _) = multispace1(input).map_cut(ErrorKind::VectorFilterLeftover)?;

View File

@ -83,7 +83,7 @@ pub enum ErrorKind<'a> {
VectorFilterInvalidEmbedder, VectorFilterInvalidEmbedder,
VectorFilterMissingFragment, VectorFilterMissingFragment,
VectorFilterInvalidFragment, VectorFilterInvalidFragment,
VectorFilterUnknownSuffix(String), VectorFilterUnknownSuffix(Option<&'static str>, String),
VectorFilterOperation, VectorFilterOperation,
InvalidPrimary, InvalidPrimary,
InvalidEscapedNumber, InvalidEscapedNumber,
@ -214,16 +214,23 @@ impl Display for Error<'_> {
ErrorKind::VectorFilterLeftover => { ErrorKind::VectorFilterLeftover => {
writeln!(f, "The vector filter has leftover tokens.")? writeln!(f, "The vector filter has leftover tokens.")?
} }
ErrorKind::VectorFilterUnknownSuffix(value) if value.as_str() == "." => { ErrorKind::VectorFilterUnknownSuffix(_, value) if value.as_str() == "." => {
writeln!(f, "Was expecting one of `.fragments`, `.userProvided`, `.documentTemplate`, `.regenerate` or nothing, but instead found a point without a valid value.")?; writeln!(f, "Was expecting one of `.fragments`, `.userProvided`, `.documentTemplate`, `.regenerate` or nothing, but instead found a point without a valid value.")?;
} }
ErrorKind::VectorFilterUnknownSuffix(value) => { ErrorKind::VectorFilterUnknownSuffix(None, value) if ["fragments", "userProvided", "documentTemplate", "regenerate"].contains(&value.as_str()) => {
// This will happen with "_vectors.rest.\"userProvided\"" for instance
writeln!(f, "Was expecting this part to be unquoted.")?
}
ErrorKind::VectorFilterUnknownSuffix(None, value) => {
if let Some(suggestion) = key_suggestion(value, &["fragments", "userProvided", "documentTemplate", "regenerate"]) { if let Some(suggestion) = key_suggestion(value, &["fragments", "userProvided", "documentTemplate", "regenerate"]) {
writeln!(f, "Was expecting one of `fragments`, `userProvided`, `documentTemplate`, `regenerate` or nothing, but instead found `{value}`. Did you mean `{suggestion}`?")?; writeln!(f, "Was expecting one of `fragments`, `userProvided`, `documentTemplate`, `regenerate` or nothing, but instead found `{value}`. Did you mean `{suggestion}`?")?;
} else { } else {
writeln!(f, "Was expecting one of `fragments`, `userProvided`, `documentTemplate`, `regenerate` or nothing, but instead found `{value}`.")?; writeln!(f, "Was expecting one of `fragments`, `userProvided`, `documentTemplate`, `regenerate` or nothing, but instead found `{value}`.")?;
} }
} }
ErrorKind::VectorFilterUnknownSuffix(Some(previous_filter_kind), value) => {
writeln!(f, "Vector filter can only accept one of `fragments`, `userProvided`, `documentTemplate` or `regenerate`, but found both `{previous_filter_kind}` and `{value}`.")?
},
ErrorKind::VectorFilterInvalidFragment => { ErrorKind::VectorFilterInvalidFragment => {
writeln!(f, "The vector filter's fragment is invalid.")? writeln!(f, "The vector filter's fragment is invalid.")?
} }
@ -234,7 +241,7 @@ impl Display for Error<'_> {
writeln!(f, "Was expecting embedder name but found nothing.")? writeln!(f, "Was expecting embedder name but found nothing.")?
} }
ErrorKind::VectorFilterInvalidEmbedder => { ErrorKind::VectorFilterInvalidEmbedder => {
writeln!(f, "The vector filter's embedder is invalid.")? writeln!(f, "The vector filter's embedder name is invalid.")?
} }
ErrorKind::VectorFilterOperation => { ErrorKind::VectorFilterOperation => {
writeln!(f, "Was expecting an operation like `EXISTS` or `NOT EXISTS` after the vector filter.")? writeln!(f, "Was expecting an operation like `EXISTS` or `NOT EXISTS` after the vector filter.")?

View File

@ -1018,7 +1018,7 @@ pub mod tests {
22:23 _vectors.embedderName. EXISTS 22:23 _vectors.embedderName. EXISTS
"); ");
insta::assert_snapshot!(p(r#"_vectors."embedderName EXISTS"#), @r#" insta::assert_snapshot!(p(r#"_vectors."embedderName EXISTS"#), @r#"
The vector filter's embedder is invalid. The vector filter's embedder name is invalid.
30:30 _vectors."embedderName EXISTS 30:30 _vectors."embedderName EXISTS
"#); "#);
insta::assert_snapshot!(p(r#"_vectors."embedderNam"e EXISTS"#), @r#" insta::assert_snapshot!(p(r#"_vectors."embedderNam"e EXISTS"#), @r#"
@ -1057,6 +1057,14 @@ pub mod tests {
Was expecting one of `fragments`, `userProvided`, `documentTemplate`, `regenerate` or nothing, but instead found `fargments`. Did you mean `fragments`? Was expecting one of `fragments`, `userProvided`, `documentTemplate`, `regenerate` or nothing, but instead found `fargments`. Did you mean `fragments`?
23:32 _vectors.embedderName.fargments.test EXISTS 23:32 _vectors.embedderName.fargments.test EXISTS
"); ");
insta::assert_snapshot!(p(r#"_vectors.embedderName."userProvided" EXISTS"#), @r#"
Was expecting this part to be unquoted.
24:36 _vectors.embedderName."userProvided" EXISTS
"#);
insta::assert_snapshot!(p(r#"_vectors.embedderName.userProvided.fragments.test EXISTS"#), @r"
Vector filter can only accept one of `fragments`, `userProvided`, `documentTemplate` or `regenerate`, but found both `userProvided` and `fragments`.
36:45 _vectors.embedderName.userProvided.fragments.test EXISTS
");
insta::assert_snapshot!(p(r#"NOT OR EXISTS AND EXISTS NOT EXISTS"#), @r###" insta::assert_snapshot!(p(r#"NOT OR EXISTS AND EXISTS NOT EXISTS"#), @r###"
Was expecting a value but instead got `OR`, which is a reserved keyword. To use `OR` as a field name or a value, surround it by quotes. Was expecting a value but instead got `OR`, which is a reserved keyword. To use `OR` as a field name or a value, surround it by quotes.