summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/common/VariantReader.cpp30
-rw-r--r--src/core/common/VariantReader.hpp13
-rw-r--r--test/core/common/VariantReaderTest.cpp50
3 files changed, 92 insertions, 1 deletions
diff --git a/src/core/common/VariantReader.cpp b/src/core/common/VariantReader.cpp
index ef71740..d9e340f 100644
--- a/src/core/common/VariantReader.cpp
+++ b/src/core/common/VariantReader.cpp
@@ -485,6 +485,36 @@ std::pair<bool, std::string> VariantReader::parseUnescapedString(
return std::make_pair(true, res.str());
}
+std::pair<bool, Variant::boolType> VariantReader::parseBool(
+ CharReader &reader, Logger &logger)
+{
+ // first we consume all whitespaces.
+ reader.consumePeek();
+ reader.consumeWhitespace();
+ // then we try to find the words "true" or "false".
+
+ bool val = false;
+ CharReaderFork readerFork = reader.fork();
+ LoggerFork loggerFork = logger.fork();
+ auto res = parseToken(readerFork, loggerFork, {});
+ if (res.first) {
+ bool valid = false;
+ if (res.second == "true") {
+ val = true;
+ valid = true;
+ } else if (res.second == "false") {
+ val = false;
+ valid = true;
+ }
+ if (valid) {
+ readerFork.commit();
+ loggerFork.commit();
+ return std::make_pair(true, val);
+ }
+ }
+ return std::make_pair(false, val);
+}
+
std::pair<bool, int64_t> VariantReader::parseInteger(
CharReader &reader, Logger &logger, const std::unordered_set<char> &delims)
{
diff --git a/src/core/common/VariantReader.hpp b/src/core/common/VariantReader.hpp
index 6b157d8..6a87723 100644
--- a/src/core/common/VariantReader.hpp
+++ b/src/core/common/VariantReader.hpp
@@ -133,6 +133,19 @@ public:
const std::unordered_set<char> &delims);
/**
+ * Parses a bool from the given CharReader instance (the strings "true" or
+ * "false").
+ *
+ * @param reader is a reference to the CharReader instance which is
+ * the source for the character data. The reader will be positioned after
+ * the bool.
+ * @param logger is the logger instance that should be used to log error
+ * messages and warnings.
+ */
+ static std::pair<bool, Variant::boolType> parseBool(CharReader &reader,
+ Logger &logger);
+
+ /**
* Parses an integer from the given CharReader instance until one of the
* given delimiter characters is reached.
*
diff --git a/test/core/common/VariantReaderTest.cpp b/test/core/common/VariantReaderTest.cpp
index f6a699b..7a688c5 100644
--- a/test/core/common/VariantReaderTest.cpp
+++ b/test/core/common/VariantReaderTest.cpp
@@ -205,7 +205,7 @@ TEST(VariantReader, parseUnescapedString)
// Simple case with whitespace
{
- CharReader reader(" hello world ; ");
+ CharReader reader(" hello world ; aha");
auto res = VariantReader::parseUnescapedString(reader, logger, {';'});
ASSERT_TRUE(res.first);
ASSERT_EQ("hello world", res.second);
@@ -228,6 +228,54 @@ TEST(VariantReader, parseUnescapedString)
}
}
+TEST(VariantReader, parseBool)
+{
+ // Valid bools
+ {
+ CharReader reader(" true ");
+ auto res = VariantReader::parseBool(reader, logger);
+ ASSERT_TRUE(res.first);
+ ASSERT_TRUE(res.second);
+ }
+ {
+ CharReader reader(" false ");
+ auto res = VariantReader::parseBool(reader, logger);
+ ASSERT_TRUE(res.first);
+ ASSERT_FALSE(res.second);
+ }
+ {
+ CharReader reader(" true bla");
+ auto res = VariantReader::parseBool(reader, logger);
+ ASSERT_TRUE(res.first);
+ ASSERT_TRUE(res.second);
+ reader.consumeWhitespace();
+ char c;
+ ASSERT_TRUE(reader.read(c));
+ ASSERT_EQ('b', c);
+ ASSERT_TRUE(reader.read(c));
+ ASSERT_EQ('l', c);
+ ASSERT_TRUE(reader.read(c));
+ ASSERT_EQ('a', c);
+ ASSERT_FALSE(reader.read(c));
+ }
+ // invalid bools.
+ {
+ CharReader reader(" bla ");
+ auto res = VariantReader::parseBool(reader, logger);
+ ASSERT_FALSE(res.first);
+ }
+ {
+ CharReader reader(" TRUE ");
+ auto res = VariantReader::parseBool(reader, logger);
+ ASSERT_FALSE(res.first);
+ }
+ {
+ CharReader reader(" tr ue ");
+ auto res = VariantReader::parseBool(reader, logger);
+ ASSERT_FALSE(res.first);
+ }
+}
+
static const std::unordered_set<char> noDelim;
TEST(VariantReader, parseInteger)