From a5e39055051c9bfd64eb61dc572c46ba235cbac7 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Sat, 8 Oct 2016 08:43:46 +0100 Subject: [PATCH] Remove condition_eval_fail error code Throw a ConditionSyntaxError if parsing doesn't throw but fails or is incomplete, and propagate all other exceptions. --- include/loot/error.h | 5 ---- src/backend/metadata/conditional_metadata.cpp | 25 ++++++++++--------- .../metadata/conditional_metadata_test.h | 4 +-- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/include/loot/error.h b/include/loot/error.h index da96e8c6..a6248271 100644 --- a/include/loot/error.h +++ b/include/loot/error.h @@ -46,11 +46,6 @@ public: * failed, but its failure was not fatal to the task being performed. */ ok = 0, - /** - * An error was encountered when attempting to evaluate a metadata - * condition. - */ - condition_eval_fail = 4, }; /** diff --git a/src/backend/metadata/conditional_metadata.cpp b/src/backend/metadata/conditional_metadata.cpp index a8797b99..2d393916 100644 --- a/src/backend/metadata/conditional_metadata.cpp +++ b/src/backend/metadata/conditional_metadata.cpp @@ -82,20 +82,21 @@ bool ConditionalMetadata::ParseCondition(Game * game) const { begin = condition_.begin(); end = condition_.end(); - bool r; - bool eval; try { - r = boost::spirit::qi::phrase_parse(begin, end, grammar, skipper, eval); + bool evaluation; + bool parseResult = boost::spirit::qi::phrase_parse(begin, end, grammar, skipper, evaluation); + + if (!parseResult || begin != end) { + BOOST_LOG_TRIVIAL(error) << "Failed to parse condition \"" << condition_ << "\": only partially matched expected syntax."; + throw ConditionSyntaxError((boost::format(translate("Failed to parse condition \"%1%\": only partially matched expected syntax.")) % condition_).str()); + } + + return evaluation; + } catch (ConditionSyntaxError& e) { + throw; } catch (exception& e) { - BOOST_LOG_TRIVIAL(error) << "Failed to parse condition \"" << condition_ << "\": " << e.what(); - throw Error(Error::Code::condition_eval_fail, (boost::format(translate("Failed to parse condition \"%1%\": %2%")) % condition_ % e.what()).str()); + BOOST_LOG_TRIVIAL(error) << "Failed to evaluate condition \"" << condition_ << "\": " << e.what(); + throw; } - - if (!r || begin != end) { - BOOST_LOG_TRIVIAL(error) << "Failed to parse condition \"" << condition_ << "\"."; - throw Error(Error::Code::condition_eval_fail, (boost::format(translate("Failed to parse condition \"%1%\".")) % condition_).str()); - } - - return eval; } } diff --git a/src/tests/backend/metadata/conditional_metadata_test.h b/src/tests/backend/metadata/conditional_metadata_test.h index 8e3e6645..c9be17c7 100644 --- a/src/tests/backend/metadata/conditional_metadata_test.h +++ b/src/tests/backend/metadata/conditional_metadata_test.h @@ -80,7 +80,7 @@ TEST_P(ConditionalMetadataTest, evalConditionShouldThrowForAnInvalidCondition) { game.SetGamePath(dataPath.parent_path()); conditionalMetadata_ = ConditionalMetadata("condition"); - EXPECT_THROW(conditionalMetadata_.EvalCondition(game), Error); + EXPECT_THROW(conditionalMetadata_.EvalCondition(game), ConditionSyntaxError); } TEST_P(ConditionalMetadataTest, evalConditionShouldReturnTrueForAConditionThatIsTrue) { @@ -105,7 +105,7 @@ TEST_P(ConditionalMetadataTest, parseConditionShouldNotThrowForAnEmptyCondition) TEST_P(ConditionalMetadataTest, parseConditionShouldThrowForAnInvalidCondition) { conditionalMetadata_ = ConditionalMetadata("condition"); - EXPECT_THROW(conditionalMetadata_.ParseCondition(), Error); + EXPECT_THROW(conditionalMetadata_.ParseCondition(), ConditionSyntaxError); } TEST_P(ConditionalMetadataTest, parseConditionShouldNotThrowForATrueCondition) {