summaryrefslogtreecommitdiffstats
path: root/Source/cmJSONHelpers.cxx
diff options
context:
space:
mode:
authorKyle Edwards <kyle.edwards@kitware.com>2023-08-16 13:26:08 (GMT)
committerKyle Edwards <kyle.edwards@kitware.com>2023-08-16 13:56:48 (GMT)
commit94241e243d0594b29a29ffb0d072d7c285bdc4e5 (patch)
treeb57bebe3c89b0e5eac07ccad5443c875b7b93c12 /Source/cmJSONHelpers.cxx
parent2588bf090ce822de44a470362019c398b2165137 (diff)
downloadCMake-94241e243d0594b29a29ffb0d072d7c285bdc4e5.zip
CMake-94241e243d0594b29a29ffb0d072d7c285bdc4e5.tar.gz
CMake-94241e243d0594b29a29ffb0d072d7c285bdc4e5.tar.bz2
cmJSONHelpers: Make error generators proper functions
Diffstat (limited to 'Source/cmJSONHelpers.cxx')
-rw-r--r--Source/cmJSONHelpers.cxx113
1 files changed, 113 insertions, 0 deletions
diff --git a/Source/cmJSONHelpers.cxx b/Source/cmJSONHelpers.cxx
new file mode 100644
index 0000000..c36b56d
--- /dev/null
+++ b/Source/cmJSONHelpers.cxx
@@ -0,0 +1,113 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#include "cmJSONHelpers.h"
+
+#include <functional>
+#include <string>
+#include <vector>
+
+#include <cm3p/json/value.h>
+
+#include "cmJSONState.h"
+
+namespace JsonErrors {
+ErrorGenerator EXPECTED_TYPE(const std::string& type)
+{
+ return [type](const Json::Value* value, cmJSONState* state) -> void {
+ if (state->key().empty()) {
+ state->AddErrorAtValue(cmStrCat("Expected ", type), value);
+ return;
+ }
+ std::string errMsg = cmStrCat("\"", state->key(), "\" expected ", type);
+ if (value && value->isConvertibleTo(Json::ValueType::stringValue)) {
+ errMsg = cmStrCat(errMsg, ", got: ", value->asString());
+ }
+ state->AddErrorAtValue(errMsg, value);
+ };
+}
+
+void INVALID_STRING(const Json::Value* value, cmJSONState* state)
+{
+ JsonErrors::EXPECTED_TYPE("a string")(value, state);
+}
+
+void INVALID_BOOL(const Json::Value* value, cmJSONState* state)
+{
+ JsonErrors::EXPECTED_TYPE("a bool")(value, state);
+}
+
+void INVALID_INT(const Json::Value* value, cmJSONState* state)
+{
+ JsonErrors::EXPECTED_TYPE("an integer")(value, state);
+}
+
+void INVALID_UINT(const Json::Value* value, cmJSONState* state)
+{
+ JsonErrors::EXPECTED_TYPE("an unsigned integer")(value, state);
+}
+
+ObjectErrorGenerator INVALID_NAMED_OBJECT(
+ const std::function<std::string(const Json::Value*, cmJSONState*)>&
+ nameGenerator)
+{
+ return [nameGenerator](
+ ObjectError errorType,
+ const Json::Value::Members& extraFields) -> ErrorGenerator {
+ return [nameGenerator, errorType, extraFields](
+ const Json::Value* value, cmJSONState* state) -> void {
+ std::string name = nameGenerator(value, state);
+ switch (errorType) {
+ case ObjectError::RequiredMissing:
+ state->AddErrorAtValue(cmStrCat("Invalid Required ", name), value);
+ break;
+ case ObjectError::InvalidObject:
+ state->AddErrorAtValue(cmStrCat("Invalid ", name), value);
+ break;
+ case ObjectError::ExtraField: {
+ for (auto const& member : extraFields) {
+ if (value) {
+ state->AddErrorAtValue(
+ cmStrCat("Invalid extra field \"", member, "\" in ", name),
+ &(*value)[member]);
+ } else {
+ state->AddError(
+ cmStrCat("Invalid extra field \"", member, "\" in ", name));
+ }
+ }
+ } break;
+ case ObjectError::MissingRequired:
+ state->AddErrorAtValue(cmStrCat("Missing required field \"",
+ state->key(), "\" in ", name),
+ value);
+ break;
+ }
+ };
+ };
+}
+
+ErrorGenerator INVALID_OBJECT(ObjectError errorType,
+ const Json::Value::Members& extraFields)
+{
+ return INVALID_NAMED_OBJECT(
+ [](const Json::Value*, cmJSONState*) -> std::string { return "Object"; })(
+ errorType, extraFields);
+}
+
+ErrorGenerator INVALID_NAMED_OBJECT_KEY(
+ ObjectError errorType, const Json::Value::Members& extraFields)
+{
+ return INVALID_NAMED_OBJECT(
+ [](const Json::Value*, cmJSONState* state) -> std::string {
+ for (auto it = state->parseStack.rbegin();
+ it != state->parseStack.rend(); ++it) {
+ if (it->first.rfind("$vector_item_", 0) == 0) {
+ continue;
+ }
+ return cmStrCat("\"", it->first, "\"");
+ }
+ return "root";
+ })(errorType, extraFields);
+}
+}