From 3e5550c910068df31b9b5adc42c603938a49eddd Mon Sep 17 00:00:00 2001 From: Tamo Date: Thu, 4 Nov 2021 16:12:17 +0100 Subject: [PATCH] clean the errors --- filter_parser/src/error.rs | 87 ++++++++------------------------------ 1 file changed, 18 insertions(+), 69 deletions(-) diff --git a/filter_parser/src/error.rs b/filter_parser/src/error.rs index f92200882..fbfbbe30b 100644 --- a/filter_parser/src/error.rs +++ b/filter_parser/src/error.rs @@ -1,6 +1,7 @@ use std::fmt::Display; -use nom::{Parser, error::{self, ParseError}}; +use nom::error::{self, ParseError}; +use nom::Parser; use crate::{IResult, Span}; @@ -31,11 +32,14 @@ impl ExtendNomError for nom::Err { } /// cut a parser and map the error -pub fn cut_with_err<'a, O>(mut parser: impl FnMut(Span<'a>) -> IResult, mut with: impl FnMut(Error<'a>) -> Error<'a>) -> impl FnMut(Span<'a>) -> IResult { - move |input| match parser.parse(input) { - Err(nom::Err::Error(e)) => Err(nom::Err::Failure(with(e))), - rest => rest, - } +pub fn cut_with_err<'a, O>( + mut parser: impl FnMut(Span<'a>) -> IResult, + mut with: impl FnMut(Error<'a>) -> Error<'a>, +) -> impl FnMut(Span<'a>) -> IResult { + move |input| match parser.parse(input) { + Err(nom::Err::Error(e)) => Err(nom::Err::Failure(with(e))), + rest => rest, + } } #[derive(Debug)] @@ -50,14 +54,12 @@ pub enum ErrorKind<'a> { Geo, MisusedGeo, InvalidPrimary, - ReservedKeyword, ExpectedEof, ExpectedValue, MissingClosingDelimiter(char), - UnexpectedInput(Vec<&'a str>), - Context(&'a str), Char(char), - Unreachable, + InternalError(error::ErrorKind), + External(String), } impl<'a> Error<'a> { @@ -68,66 +70,15 @@ impl<'a> Error<'a> { match self.kind { ErrorKind::Char(c) => c, _ => panic!("Internal filter parser error"), - } } + } } impl<'a> ParseError> for Error<'a> { fn from_error_kind(input: Span<'a>, kind: error::ErrorKind) -> Self { let kind = match kind { error::ErrorKind::Eof => ErrorKind::ExpectedEof, - error::ErrorKind::Tag => ErrorKind::UnexpectedInput(Vec::new()), - error::ErrorKind::MapRes => todo!(), - error::ErrorKind::MapOpt => todo!(), - error::ErrorKind::Alt => todo!(), - error::ErrorKind::IsNot => todo!(), - error::ErrorKind::IsA => todo!(), - error::ErrorKind::SeparatedList => todo!(), - error::ErrorKind::SeparatedNonEmptyList => todo!(), - error::ErrorKind::Many0 => todo!(), - error::ErrorKind::Many1 => todo!(), - error::ErrorKind::ManyTill => todo!(), - error::ErrorKind::Count => todo!(), - error::ErrorKind::TakeUntil => todo!(), - error::ErrorKind::LengthValue => todo!(), - error::ErrorKind::TagClosure => todo!(), - error::ErrorKind::Alpha => todo!(), - error::ErrorKind::Digit => todo!(), - error::ErrorKind::HexDigit => todo!(), - error::ErrorKind::OctDigit => todo!(), - error::ErrorKind::AlphaNumeric => todo!(), - error::ErrorKind::Space => todo!(), - error::ErrorKind::MultiSpace => todo!(), - error::ErrorKind::LengthValueFn => todo!(), - error::ErrorKind::Switch => todo!(), - error::ErrorKind::TagBits => todo!(), - error::ErrorKind::OneOf => todo!(), - error::ErrorKind::NoneOf => todo!(), - error::ErrorKind::Char => todo!(), - error::ErrorKind::CrLf => todo!(), - error::ErrorKind::RegexpMatch => todo!(), - error::ErrorKind::RegexpMatches => todo!(), - error::ErrorKind::RegexpFind => todo!(), - error::ErrorKind::RegexpCapture => todo!(), - error::ErrorKind::RegexpCaptures => todo!(), - error::ErrorKind::TakeWhile1 => ErrorKind::Unreachable, - error::ErrorKind::Complete => todo!(), - error::ErrorKind::Fix => todo!(), - error::ErrorKind::Escaped => todo!(), - error::ErrorKind::EscapedTransform => todo!(), - error::ErrorKind::NonEmpty => todo!(), - error::ErrorKind::ManyMN => todo!(), - error::ErrorKind::Not => todo!(), - error::ErrorKind::Permutation => todo!(), - error::ErrorKind::Verify => todo!(), - error::ErrorKind::TakeTill1 => todo!(), - error::ErrorKind::TakeWhileMN => todo!(), - error::ErrorKind::TooLarge => todo!(), - error::ErrorKind::Many0Count => todo!(), - error::ErrorKind::Many1Count => todo!(), - error::ErrorKind::Float => todo!(), - error::ErrorKind::Satisfy => todo!(), - error::ErrorKind::Fail => todo!(), + kind => ErrorKind::InternalError(kind), }; Self { context: input, kind } } @@ -149,7 +100,7 @@ impl<'a> Display for Error<'a> { ErrorKind::ExpectedValue if input.trim().is_empty() => { writeln!(f, "Was expecting a value but instead got nothing.")? } - ErrorKind::MissingClosingDelimiter(c) => { + ErrorKind::MissingClosingDelimiter(c) => { writeln!(f, "Expression `{}` is missing the following closing delimiter: `{}`.", input, c)? } ErrorKind::ExpectedValue => { @@ -176,13 +127,11 @@ impl<'a> Display for Error<'a> { ErrorKind::Char(c) => { panic!("Tried to display a char error with `{}`", c) } - ErrorKind::ReservedKeyword => writeln!(f, "reserved keyword")?, - ErrorKind::UnexpectedInput(ref v) => writeln!(f, "Unexpected input found `{}`, vec: `{:?}`", input, v)?, - ErrorKind::Context(_) => todo!(), - ErrorKind::Unreachable => writeln!( + ErrorKind::InternalError(kind) => writeln!( f, - "Encountered an internal error while parsing your filter. Please fill an issue" + "Encountered an internal `{:?}` error while parsing your filter. Please fill an issue", kind )?, + ErrorKind::External(ref error) => writeln!(f, "{}", error)?, } write!( f,