From 2c40482bc0676877adb4369dfe85d11b2ee79904 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 9 Nov 2018 01:44:02 +0100 Subject: [PATCH] Implement subscript operator returning sections --- src/core/desktopfilereader.cpp | 11 +++++++++++ src/core/desktopfilereader.h | 10 +++++++++- tests/core/test_desktopfilereader.cpp | 10 ++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/core/desktopfilereader.cpp b/src/core/desktopfilereader.cpp index 82e06c3..25eed6a 100644 --- a/src/core/desktopfilereader.cpp +++ b/src/core/desktopfilereader.cpp @@ -148,3 +148,14 @@ bool DesktopFileReader::operator!=(const DesktopFileReader& other) const { boost::filesystem::path DesktopFileReader::path() const { return d->path; } + +section_t DesktopFileReader::operator[](const std::string& name) { + auto it = d->sections.find(name); + + // the map would lazy-initialize a new entry in case the section doesn't exist + // therefore explicitly checking whether the section exists, throwing an exception in case it does not + if (it == d->sections.end()) + throw std::range_error("could not find section " + name); + + return it->second; +} diff --git a/src/core/desktopfilereader.h b/src/core/desktopfilereader.h index 6877c4b..a830f51 100644 --- a/src/core/desktopfilereader.h +++ b/src/core/desktopfilereader.h @@ -1,12 +1,16 @@ #pragma once // system includes -#include #include +#include +#include // library includes #include +// local includes +#include "desktopfileentry.h" + class DesktopFileReader { private: // opaque data class pattern @@ -44,4 +48,8 @@ public: // returns desktop file path boost::filesystem::path path() const; + + // get a specific section from the parsed data + // throws std::range_error if section does not exist + std::unordered_map operator[](const std::string& name); }; diff --git a/tests/core/test_desktopfilereader.cpp b/tests/core/test_desktopfilereader.cpp index 6dea7c9..9f261bb 100644 --- a/tests/core/test_desktopfilereader.cpp +++ b/tests/core/test_desktopfilereader.cpp @@ -104,6 +104,16 @@ TEST_F(DesktopFileReaderFixture, testParseSimpleDesktopFile) { reader = DesktopFileReader(ss); } +TEST_F(DesktopFileReaderFixture, testParseFileGetNonExistingSection) { + std::stringstream ss; + ss << "[Desktop File]" << std::endl; + + DesktopFileReader reader; + reader = DesktopFileReader(ss); + + ASSERT_THROW(reader["Non-existing Section"], std::range_error); +} + TEST_F(DesktopFileReaderFixture, testParseFileMissingSectionHeader) { std::stringstream ss; ss << "Name=name" << std::endl