diff options
author | Martin Duffy <martin.duffy@kitware.com> | 2023-03-22 17:11:21 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-03-29 14:41:19 (GMT) |
commit | 19305afd8a2a46925b1a880de68f7be0ad1f3091 (patch) | |
tree | cdef4417cd852c2a5dd85886df4ff61d7fd2e653 /Source/cmJSONState.h | |
parent | 6b08358e17f5b85ad04ab512e4b6e39e989cea35 (diff) | |
download | CMake-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.h | 73 |
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); +}; |