mirror of
				https://github.com/Laupetin/OpenAssetTools.git
				synced 2025-10-31 10:36:58 +00:00 
			
		
		
		
	refactor: use asset_type_t for ZoneDefinition
This commit is contained in:
		| @@ -13,7 +13,7 @@ SequenceZoneDefinitionAssetList::SequenceZoneDefinitionAssetList() | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void SequenceZoneDefinitionAssetList::ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| void SequenceZoneDefinitionAssetList::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| { | ||||
|     state->m_asset_lists.emplace_back(result.NextCapture(CAPTURE_ASSET_LIST_NAME).FieldValue()); | ||||
|     state->m_definition->m_asset_lists.emplace_back(result.NextCapture(CAPTURE_ASSET_LIST_NAME).FieldValue()); | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ class SequenceZoneDefinitionAssetList final : public ZoneDefinitionParser::seque | ||||
|     static constexpr auto CAPTURE_ASSET_LIST_NAME = 1; | ||||
|  | ||||
| protected: | ||||
|     void ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|     void ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|  | ||||
| public: | ||||
|     SequenceZoneDefinitionAssetList(); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ SequenceZoneDefinitionBuild::SequenceZoneDefinitionBuild() | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void SequenceZoneDefinitionBuild::ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| void SequenceZoneDefinitionBuild::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| { | ||||
|     state->m_targets_to_build.emplace_back(result.NextCapture(CAPTURE_BUILD_TARGET_NAME).FieldValue()); | ||||
|     state->m_definition->m_targets_to_build.emplace_back(result.NextCapture(CAPTURE_BUILD_TARGET_NAME).FieldValue()); | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ class SequenceZoneDefinitionBuild final : public ZoneDefinitionParser::sequence_ | ||||
|     static constexpr auto CAPTURE_BUILD_TARGET_NAME = 1; | ||||
|  | ||||
| protected: | ||||
|     void ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|     void ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|  | ||||
| public: | ||||
|     SequenceZoneDefinitionBuild(); | ||||
|   | ||||
| @@ -19,19 +19,23 @@ SequenceZoneDefinitionEntry::SequenceZoneDefinitionEntry() | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void SequenceZoneDefinitionEntry::ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| void SequenceZoneDefinitionEntry::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| { | ||||
|     const auto& assetNameCapture = result.NextCapture(CAPTURE_ASSET_NAME); | ||||
|     const auto& typeNameToken = result.NextCapture(CAPTURE_TYPE_NAME); | ||||
|  | ||||
|     if (!state->m_asset_name_resolver) | ||||
|         throw ParsingException(typeNameToken.GetPos(), "Must define game before first asset"); | ||||
|  | ||||
|     const auto maybeAssetType = state->m_asset_name_resolver->GetAssetTypeByName(typeNameToken.FieldValue()); | ||||
|     if (!maybeAssetType) | ||||
|         throw ParsingException(typeNameToken.GetPos(), "Unknown asset type"); | ||||
|  | ||||
|     const auto& assetNameToken = result.NextCapture(CAPTURE_ASSET_NAME); | ||||
|     std::string assetName; | ||||
|     if (assetNameCapture.m_type == ZoneDefinitionParserValueType::STRING) | ||||
|     { | ||||
|         assetName = assetNameCapture.StringValue(); | ||||
|     } | ||||
|     if (typeNameToken.m_type == ZoneDefinitionParserValueType::STRING) | ||||
|         assetName = typeNameToken.StringValue(); | ||||
|     else | ||||
|     { | ||||
|         assetName = assetNameCapture.FieldValue(); | ||||
|     } | ||||
|         assetName = typeNameToken.FieldValue(); | ||||
|  | ||||
|     state->m_assets.emplace_back(result.NextCapture(CAPTURE_TYPE_NAME).FieldValue(), assetName, result.NextTag() == TAG_REFERENCE); | ||||
|     state->m_definition->m_assets.emplace_back(*maybeAssetType, assetName, result.NextTag() == TAG_REFERENCE); | ||||
| } | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class SequenceZoneDefinitionEntry final : public ZoneDefinitionParser::sequence_ | ||||
|     static constexpr auto CAPTURE_ASSET_NAME = 2; | ||||
|  | ||||
| protected: | ||||
|     void ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|     void ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|  | ||||
| public: | ||||
|     SequenceZoneDefinitionEntry(); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ SequenceZoneDefinitionIgnore::SequenceZoneDefinitionIgnore() | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void SequenceZoneDefinitionIgnore::ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| void SequenceZoneDefinitionIgnore::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| { | ||||
|     state->m_ignores.emplace_back(result.NextCapture(CAPTURE_IGNORE_NAME).FieldValue()); | ||||
|     state->m_definition->m_ignores.emplace_back(result.NextCapture(CAPTURE_IGNORE_NAME).FieldValue()); | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ class SequenceZoneDefinitionIgnore final : public ZoneDefinitionParser::sequence | ||||
|     static constexpr auto CAPTURE_IGNORE_NAME = 1; | ||||
|  | ||||
| protected: | ||||
|     void ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|     void ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|  | ||||
| public: | ||||
|     SequenceZoneDefinitionIgnore(); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ SequenceZoneDefinitionInclude::SequenceZoneDefinitionInclude() | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void SequenceZoneDefinitionInclude::ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| void SequenceZoneDefinitionInclude::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| { | ||||
|     state->m_includes.emplace_back(result.NextCapture(CAPTURE_INCLUDE_NAME).FieldValue()); | ||||
|     state->m_definition->m_includes.emplace_back(result.NextCapture(CAPTURE_INCLUDE_NAME).FieldValue()); | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ class SequenceZoneDefinitionInclude final : public ZoneDefinitionParser::sequenc | ||||
|     static constexpr auto CAPTURE_INCLUDE_NAME = 1; | ||||
|  | ||||
| protected: | ||||
|     void ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|     void ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|  | ||||
| public: | ||||
|     SequenceZoneDefinitionInclude(); | ||||
|   | ||||
| @@ -1,6 +1,51 @@ | ||||
| #include "SequenceZoneDefinitionMetaData.h" | ||||
|  | ||||
| #include "Game/IW3/AssetNameResolverIW3.h" | ||||
| #include "Game/IW4/AssetNameResolverIW4.h" | ||||
| #include "Game/IW5/AssetNameResolverIW5.h" | ||||
| #include "Game/T5/AssetNameResolverT5.h" | ||||
| #include "Game/T6/AssetNameResolverT6.h" | ||||
| #include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" | ||||
| #include "Utils/StringUtils.h" | ||||
|  | ||||
| #include <format> | ||||
| #include <optional> | ||||
|  | ||||
| namespace | ||||
| { | ||||
|     constexpr auto METADATA_GAME = "game"; | ||||
|     constexpr auto METADATA_GDT = "gdt"; | ||||
|     constexpr auto METADATA_NAME = "name"; | ||||
|     constexpr auto METADATA_TYPE = "type"; | ||||
|  | ||||
|     std::optional<GameId> GetGameByName(const std::string& gameName) | ||||
|     { | ||||
|         auto upperGameName = gameName; | ||||
|         utils::MakeStringUpperCase(upperGameName); | ||||
|  | ||||
|         for (auto i = 0u; i < static_cast<unsigned>(GameId::COUNT); i++) | ||||
|         { | ||||
|             if (upperGameName == GameId_Names[i]) | ||||
|                 return static_cast<GameId>(i); | ||||
|         } | ||||
|  | ||||
|         return std::nullopt; | ||||
|     } | ||||
|  | ||||
|     std::optional<ProjectType> GetProjectTypeByName(const std::string& projectTypeName) | ||||
|     { | ||||
|         auto lowerProjectTypeName = projectTypeName; | ||||
|         utils::MakeStringLowerCase(lowerProjectTypeName); | ||||
|  | ||||
|         for (auto i = 0u; i < static_cast<unsigned>(ProjectType::COUNT); i++) | ||||
|         { | ||||
|             if (lowerProjectTypeName == ProjectType_Names[i]) | ||||
|                 return static_cast<ProjectType>(i); | ||||
|         } | ||||
|  | ||||
|         return std::nullopt; | ||||
|     } | ||||
| } // namespace | ||||
|  | ||||
| SequenceZoneDefinitionMetaData::SequenceZoneDefinitionMetaData() | ||||
| { | ||||
| @@ -14,7 +59,44 @@ SequenceZoneDefinitionMetaData::SequenceZoneDefinitionMetaData() | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void SequenceZoneDefinitionMetaData::ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| void SequenceZoneDefinitionMetaData::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const | ||||
| { | ||||
|     state->AddMetaData(result.NextCapture(CAPTURE_KEY).FieldValue(), result.NextCapture(CAPTURE_VALUE).FieldValue()); | ||||
|     const auto& keyToken = result.NextCapture(CAPTURE_KEY); | ||||
|     auto key = keyToken.FieldValue(); | ||||
|     const auto& valueToken = result.NextCapture(CAPTURE_VALUE); | ||||
|     const auto& value = result.NextCapture(CAPTURE_VALUE).FieldValue(); | ||||
|  | ||||
|     utils::MakeStringLowerCase(key); | ||||
|  | ||||
|     if (key == METADATA_GAME) | ||||
|     { | ||||
|         const auto game = GetGameByName(value); | ||||
|         if (!game) | ||||
|             throw ParsingException(valueToken.GetPos(), "Unknown game name"); | ||||
|  | ||||
|         const auto previousGame = state->m_definition->m_game; | ||||
|         if (previousGame != GameId::COUNT && previousGame != *game) | ||||
|             throw ParsingException(valueToken.GetPos(), std::format("Game was previously defined as: {}", GameId_Names[static_cast<unsigned>(previousGame)])); | ||||
|  | ||||
|         state->m_definition->m_game = *game; | ||||
|         state->m_asset_name_resolver = IAssetNameResolver::GetResolverForGame(*game); | ||||
|     } | ||||
|     else if (key == METADATA_GDT) | ||||
|     { | ||||
|         state->m_definition->m_gdts.emplace_back(value); | ||||
|     } | ||||
|     else if (key == METADATA_NAME) | ||||
|     { | ||||
|         state->m_definition->m_name = value; | ||||
|     } | ||||
|     else if (key == METADATA_TYPE) | ||||
|     { | ||||
|         const auto projectType = GetProjectTypeByName(value); | ||||
|         if (!projectType) | ||||
|             throw ParsingException(valueToken.GetPos(), "Unknown project type name"); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         state->m_definition->m_properties.AddProperty(key, value); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -8,7 +8,7 @@ class SequenceZoneDefinitionMetaData final : public ZoneDefinitionParser::sequen | ||||
|     static constexpr auto CAPTURE_VALUE = 2; | ||||
|  | ||||
| protected: | ||||
|     void ProcessMatch(ZoneDefinition* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|     void ProcessMatch(ZoneDefinitionParserState* state, SequenceResult<ZoneDefinitionParserValue>& result) const override; | ||||
|  | ||||
| public: | ||||
|     SequenceZoneDefinitionMetaData(); | ||||
|   | ||||
| @@ -8,11 +8,11 @@ | ||||
| #include "Sequence/SequenceZoneDefinitionMetaData.h" | ||||
|  | ||||
| ZoneDefinitionParser::ZoneDefinitionParser(ZoneDefinitionLexer* lexer) | ||||
|     : AbstractParser(lexer, std::make_unique<ZoneDefinition>()) | ||||
|     : AbstractParser(lexer, std::make_unique<ZoneDefinitionParserState>()) | ||||
| { | ||||
| } | ||||
|  | ||||
| const std::vector<AbstractParser<ZoneDefinitionParserValue, ZoneDefinition>::sequence_t*>& ZoneDefinitionParser::GetTestsForState() | ||||
| const std::vector<AbstractParser<ZoneDefinitionParserValue, ZoneDefinitionParserState>::sequence_t*>& ZoneDefinitionParser::GetTestsForState() | ||||
| { | ||||
|     static std::vector<sequence_t*> tests({ | ||||
|         new SequenceZoneDefinitionMetaData(), | ||||
| @@ -28,5 +28,5 @@ const std::vector<AbstractParser<ZoneDefinitionParserValue, ZoneDefinition>::seq | ||||
|  | ||||
| std::unique_ptr<ZoneDefinition> ZoneDefinitionParser::GetParsedValue() | ||||
| { | ||||
|     return std::move(m_state); | ||||
|     return std::move(m_state->m_definition); | ||||
| } | ||||
|   | ||||
| @@ -3,9 +3,10 @@ | ||||
| #include "Parsing/Impl/AbstractParser.h" | ||||
| #include "Zone/Definition/ZoneDefinition.h" | ||||
| #include "ZoneDefinitionLexer.h" | ||||
| #include "ZoneDefinitionParserState.h" | ||||
| #include "ZoneDefinitionParserValue.h" | ||||
|  | ||||
| class ZoneDefinitionParser final : public AbstractParser<ZoneDefinitionParserValue, ZoneDefinition> | ||||
| class ZoneDefinitionParser final : public AbstractParser<ZoneDefinitionParserValue, ZoneDefinitionParserState> | ||||
| { | ||||
| protected: | ||||
|     const std::vector<sequence_t*>& GetTestsForState() override; | ||||
|   | ||||
| @@ -0,0 +1,7 @@ | ||||
| #include "ZoneDefinitionParserState.h" | ||||
|  | ||||
| ZoneDefinitionParserState::ZoneDefinitionParserState() | ||||
|     : m_asset_name_resolver(nullptr), | ||||
|       m_definition(std::make_unique<ZoneDefinition>()) | ||||
| { | ||||
| } | ||||
| @@ -0,0 +1,15 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "Zone/AssetNameResolver.h" | ||||
| #include "Zone/Definition/ZoneDefinition.h" | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| class ZoneDefinitionParserState | ||||
| { | ||||
| public: | ||||
|     ZoneDefinitionParserState(); | ||||
|  | ||||
|     const IAssetNameResolver* m_asset_name_resolver; | ||||
|     std::unique_ptr<ZoneDefinition> m_definition; | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user