From a60f5b833a8b9aca4d486ce9a87f84e0bb1fbac5 Mon Sep 17 00:00:00 2001 From: Nav Date: Mon, 12 Feb 2024 19:18:16 +0000 Subject: [PATCH] Updated property group structure to align with new TDF format --- .../TargetDescription/PropertyGroup.hpp | 82 +++++++++++++++++-- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/src/Targets/TargetDescription/PropertyGroup.hpp b/src/Targets/TargetDescription/PropertyGroup.hpp index f823ca2a..174d5afb 100644 --- a/src/Targets/TargetDescription/PropertyGroup.hpp +++ b/src/Targets/TargetDescription/PropertyGroup.hpp @@ -1,25 +1,89 @@ #pragma once #include -#include #include +#include +#include +#include +#include +#include + +#include "src/Services/StringService.hpp" +#include "src/Exceptions/Exception.hpp" namespace Targets::TargetDescription { struct Property { - std::string name; + std::string key; + std::string value; - /* - * We use QString here as we're dealing with arbitrary values and QString provides many helpful - * functions to make this easier. - */ - QString value; + Property(const std::string& key, const std::string& value) + : key(key) + , value(value) + {} }; struct PropertyGroup { - std::string name; - std::map propertiesMappedByName; + std::string key; + std::map> propertiesMappedByKey; + std::map> subGroupsMappedByKey; + + PropertyGroup( + const std::string& key, + const std::map>& propertiesMappedByKey, + const std::map>& subGroupsMappedByKey + ) + : key(key) + , propertiesMappedByKey(propertiesMappedByKey) + , subGroupsMappedByKey(subGroupsMappedByKey) + {} + + std::optional> getSubGroup(std::string_view keyStr) const { + return this->getSubGroup(Services::StringService::split(keyStr, '.')); + } + + template + requires + std::ranges::sized_range + std::optional> getSubGroup(KeysType keys) const { + auto firstSubGroupIt = this->subGroupsMappedByKey.find(*(keys.begin())); + if (firstSubGroupIt == this->subGroupsMappedByKey.end()) { + return std::nullopt; + } + + auto subGroup = std::optional(std::cref(firstSubGroupIt->second)); + for (const auto key : keys | std::ranges::views::drop(1)) { + subGroup = subGroup->get().getSubGroup(key); + + if (!subGroup.has_value()) { + break; + } + } + + return subGroup; + } + + std::optional> tryGetProperty(std::string_view key) const { + const auto propertyIt = this->propertiesMappedByKey.find(key); + + if (propertyIt == this->propertiesMappedByKey.end()) { + return std::nullopt; + } + + return std::cref(propertyIt->second); + } + + const Property& getProperty(std::string_view key) const { + const auto property = this->tryGetProperty(key); + if (!property.has_value()) { + throw Exceptions::Exception( + "Failed to get property \"" + std::string(key) + "\" from property group in TDF - property not found" + ); + } + + return property->get(); + } }; }