| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #pragma once | |
| #include "cmConfigure.h" // IWYU pragma: keep | |
| #include <cstddef> | |
| #include <istream> | |
| #include <string> | |
| #include <utility> | |
| #include <vector> | |
| namespace Json { | |
| class Value; | |
| } | |
| class cmJSONState | |
| { | |
| using Location = struct | |
| { | |
| int line; | |
| int column; | |
| }; | |
| public: | |
| using JsonPair = std::pair<std::string const, Json::Value const*>; | |
| enum class StrictMode | |
| { | |
| Strict, | |
| Relaxed, | |
| }; | |
| cmJSONState() = default; | |
| cmJSONState(std::string jsonFile, Json::Value* root, | |
| StrictMode strictMode = StrictMode::Strict); | |
| cmJSONState(std::istream& jsonIStream, Json::Value* root, | |
| StrictMode strictMode = StrictMode::Strict); | |
| void AddError(std::string const& errMsg); | |
| void AddErrorAtValue(std::string const& errMsg, Json::Value const* 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); | |
| Json::Value const* value_after(std::string const& key); | |
| void push_stack(std::string const& key, Json::Value const* 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 { return message; } | |
| Location GetLocation() const { return location; } | |
| private: | |
| Location location; | |
| std::string message; | |
| }; | |
| std::vector<JsonPair> parseStack; | |
| std::vector<Error> errors; | |
| std::string doc; | |
| bool allowComments = false; | |
| private: | |
| void ReadJSONStream(std::istream& jsonIStream, Json::Value* root, | |
| StrictMode strictMode); | |
| std::string GetJsonContext(Location loc); | |
| Location LocateInDocument(ptrdiff_t offset); | |
| std::string Filename; | |
| }; |