From 2a7520cbdc54cad84f769fb93b3af33069373994 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Thu, 8 May 2025 17:02:02 +0100 Subject: [PATCH] Return nullopt if condition eval removes all metadata --- src/api/metadata/condition_evaluator.cpp | 6 +++++- src/api/metadata/condition_evaluator.h | 3 ++- src/tests/api/interface/game_interface_test.h | 8 ++++---- .../api/internals/metadata/condition_evaluator_test.h | 5 ++--- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/api/metadata/condition_evaluator.cpp b/src/api/metadata/condition_evaluator.cpp index bff1c6e3..d16143a4 100644 --- a/src/api/metadata/condition_evaluator.cpp +++ b/src/api/metadata/condition_evaluator.cpp @@ -119,7 +119,7 @@ bool ConditionEvaluator::Evaluate(const std::string& condition) { return result == LCI_RESULT_TRUE; } -PluginMetadata ConditionEvaluator::EvaluateAll( +std::optional ConditionEvaluator::EvaluateAll( const PluginMetadata& pluginMetadata) { PluginMetadata evaluatedMetadata(pluginMetadata.GetName()); evaluatedMetadata.SetLocations(pluginMetadata.GetLocations()); @@ -179,6 +179,10 @@ PluginMetadata ConditionEvaluator::EvaluateAll( evaluatedMetadata.SetCleanInfo(infoVector); } + if (evaluatedMetadata.HasNameOnly()) { + return std::nullopt; + } + return evaluatedMetadata; } diff --git a/src/api/metadata/condition_evaluator.h b/src/api/metadata/condition_evaluator.h index acc25895..ce6acbc5 100644 --- a/src/api/metadata/condition_evaluator.h +++ b/src/api/metadata/condition_evaluator.h @@ -44,7 +44,8 @@ public: const std::filesystem::path& dataPath); bool Evaluate(const std::string& condition); - PluginMetadata EvaluateAll(const PluginMetadata& pluginMetadata); + std::optional EvaluateAll( + const PluginMetadata& pluginMetadata); void ClearConditionCache(); void RefreshActivePluginsState( diff --git a/src/tests/api/interface/game_interface_test.h b/src/tests/api/interface/game_interface_test.h index ab5d7888..6e4abe91 100644 --- a/src/tests/api/interface/game_interface_test.h +++ b/src/tests/api/interface/game_interface_test.h @@ -93,16 +93,16 @@ TEST_P(GameInterfaceTest, setAdditionalDataPathsShouldClearTheConditionCache) { handle_->GetDatabase().SetPluginUserMetadata(metadata); auto evaluatedMetadata = - handle_->GetDatabase().GetPluginUserMetadata(blankEsm, true).value(); - EXPECT_TRUE(evaluatedMetadata.GetLoadAfterFiles().empty()); + handle_->GetDatabase().GetPluginUserMetadata(blankEsm, true); + EXPECT_FALSE(evaluatedMetadata.has_value()); const auto dataFilePath = gamePath.parent_path() / "Data" / "plugin.esp"; touch(dataFilePath); handle_->SetAdditionalDataPaths({dataFilePath.parent_path()}); evaluatedMetadata = - handle_->GetDatabase().GetPluginUserMetadata(blankEsm, true).value(); - EXPECT_FALSE(evaluatedMetadata.GetLoadAfterFiles().empty()); + handle_->GetDatabase().GetPluginUserMetadata(blankEsm, true); + EXPECT_FALSE(evaluatedMetadata.value().GetLoadAfterFiles().empty()); } TEST_P(GameInterfaceTest, diff --git a/src/tests/api/internals/metadata/condition_evaluator_test.h b/src/tests/api/internals/metadata/condition_evaluator_test.h index b890e6bb..9c0d07e7 100644 --- a/src/tests/api/internals/metadata/condition_evaluator_test.h +++ b/src/tests/api/internals/metadata/condition_evaluator_test.h @@ -174,7 +174,7 @@ TEST_P(ConditionEvaluatorTest, evaluateAllShouldEvaluateAllMetadataConditions) { plugin.SetDirtyInfo({info1, info2}); plugin.SetCleanInfo({info1, info2}); - EXPECT_NO_THROW(plugin = evaluator_.EvaluateAll(plugin)); + EXPECT_NO_THROW(plugin = evaluator_.EvaluateAll(plugin).value()); std::vector expectedFiles({file1}); EXPECT_EQ("group1", plugin.GetGroup().value()); @@ -190,8 +190,7 @@ TEST_P(ConditionEvaluatorTest, evaluateAllShouldEvaluateAllMetadataConditions) { TEST_P(ConditionEvaluatorTest, evaluateAllShouldPreserveGroupExplicitness) { PluginMetadata plugin(blankEsm); - EXPECT_NO_THROW(plugin = evaluator_.EvaluateAll(plugin)); - EXPECT_FALSE(plugin.GetGroup()); + EXPECT_FALSE(evaluator_.EvaluateAll(plugin).has_value()); } TEST_P(ConditionEvaluatorTest,