summaryrefslogtreecommitdiffstats
path: root/Source/cmJSONState.h
diff options
context:
space:
mode:
authorMartin Duffy <martin.duffy@kitware.com>2023-03-22 17:11:21 (GMT)
committerBrad King <brad.king@kitware.com>2023-03-29 14:41:19 (GMT)
commit19305afd8a2a46925b1a880de68f7be0ad1f3091 (patch)
treecdef4417cd852c2a5dd85886df4ff61d7fd2e653 /Source/cmJSONState.h
parent6b08358e17f5b85ad04ab512e4b6e39e989cea35 (diff)
downloadCMake-19305afd8a2a46925b1a880de68f7be0ad1f3091.zip
CMake-19305afd8a2a46925b1a880de68f7be0ad1f3091.tar.gz
CMake-19305afd8a2a46925b1a880de68f7be0ad1f3091.tar.bz2
presets: Improve JSON parser and error messages
Diffstat (limited to 'Source/cmJSONState.h')
-rw-r--r--Source/cmJSONState.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/Source/cmJSONState.h b/Source/cmJSONState.h
new file mode 100644
index 0000000..4984c81
--- /dev/null
+++ b/Source/cmJSONState.h
@@ -0,0 +1,73 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#pragma once
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#include <cstddef>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "cmJSONState.h"
+#include "cmStringAlgorithms.h"
+
+namespace Json {
+class Value;
+}
+
+class cmJSONState
+{
+ using Location = struct
+ {
+ int line;
+ int column;
+ };
+
+public:
+ using JsonPair = std::pair<const std::string, const Json::Value*>;
+ cmJSONState() = default;
+ cmJSONState(const std::string& filename, Json::Value* root);
+ void AddError(std::string const& errMsg);
+ void AddErrorAtValue(std::string const& errMsg, const Json::Value* value);
+ void AddErrorAtOffset(std::string const& errMsg, std::ptrdiff_t offset);
+ std::string GetErrorMessage(bool showContext = true);
+ std::string key();
+ std::string key_after(std::string const& key);
+ const Json::Value* value_after(std::string const& key);
+ void push_stack(std::string const& key, const Json::Value* value);
+ void pop_stack();
+
+ class Error
+ {
+ public:
+ Error(Location loc, std::string errMsg)
+ : location(loc)
+ , message(std::move(errMsg)){};
+ Error(std::string errMsg)
+ : location({ -1, -1 })
+ , message(std::move(errMsg)){};
+ std::string GetErrorMessage() const
+ {
+ std::string output = message;
+ if (location.line > 0) {
+ output = cmStrCat("Error: @", location.line, ",", location.column,
+ ": ", output);
+ }
+ return output;
+ }
+ Location GetLocation() const { return location; }
+
+ private:
+ Location location;
+ std::string message;
+ };
+
+ std::vector<JsonPair> parseStack;
+ std::vector<Error> errors;
+ std::string doc;
+
+private:
+ std::string GetJsonContext(Location loc);
+ Location LocateInDocument(ptrdiff_t offset);
+};