From 611c44b6e0848dc25bcf4a0348c3bba31bcb1679 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 20 Feb 2023 16:49:22 +0100 Subject: [PATCH] Remove code duplication. --- src/parser/mod.rs | 84 ++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 49 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ea6bdd6c4..d9f4a4e5a 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -36,61 +36,47 @@ impl<'a> ParseError<'a> { } pub fn parse<'a>(file_name: Option<&str>, input: &'a str) -> Result> { - powdr::PILFileParser::new().parse(input).map_err(|err| { - let (&start, &end) = match &err { - lalrpop_util::ParseError::InvalidToken { location } => (location, location), - lalrpop_util::ParseError::UnrecognizedEOF { - location, - expected: _, - } => (location, location), - lalrpop_util::ParseError::UnrecognizedToken { - token: (start, _, end), - expected: _, - } => (start, end), - lalrpop_util::ParseError::ExtraToken { - token: (start, _, end), - } => (start, end), - lalrpop_util::ParseError::User { error: _ } => (&0, &0), - }; - ParseError { - start, - end, - file_name: file_name.unwrap_or("input").to_string(), - contents: input, - message: format!("{err}"), - } - }) + powdr::PILFileParser::new() + .parse(input) + .map_err(|err| handle_error(err, file_name, input)) } pub fn parse_asm<'a>( file_name: Option<&str>, input: &'a str, ) -> Result> { - powdr::ASMFileParser::new().parse(input).map_err(|err| { - // TODO code duplication - let (&start, &end) = match &err { - lalrpop_util::ParseError::InvalidToken { location } => (location, location), - lalrpop_util::ParseError::UnrecognizedEOF { - location, - expected: _, - } => (location, location), - lalrpop_util::ParseError::UnrecognizedToken { - token: (start, _, end), - expected: _, - } => (start, end), - lalrpop_util::ParseError::ExtraToken { - token: (start, _, end), - } => (start, end), - lalrpop_util::ParseError::User { error: _ } => (&0, &0), - }; - ParseError { - start, - end, - file_name: file_name.unwrap_or("input").to_string(), - contents: input, - message: format!("{err}"), - } - }) + powdr::ASMFileParser::new() + .parse(input) + .map_err(|err| handle_error(err, file_name, input)) +} + +fn handle_error<'a>( + err: lalrpop_util::ParseError, + file_name: Option<&str>, + input: &'a str, +) -> ParseError<'a> { + let (&start, &end) = match &err { + lalrpop_util::ParseError::InvalidToken { location } => (location, location), + lalrpop_util::ParseError::UnrecognizedEOF { + location, + expected: _, + } => (location, location), + lalrpop_util::ParseError::UnrecognizedToken { + token: (start, _, end), + expected: _, + } => (start, end), + lalrpop_util::ParseError::ExtraToken { + token: (start, _, end), + } => (start, end), + lalrpop_util::ParseError::User { error: _ } => (&0, &0), + }; + ParseError { + start, + end, + file_name: file_name.unwrap_or("input").to_string(), + contents: input, + message: format!("{err}"), + } } #[cfg(test)]