summaryrefslogtreecommitdiff
path: root/Source/CTest/cmCTestResourceSpec.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/CTest/cmCTestResourceSpec.cxx')
-rw-r--r--Source/CTest/cmCTestResourceSpec.cxx148
1 files changed, 42 insertions, 106 deletions
diff --git a/Source/CTest/cmCTestResourceSpec.cxx b/Source/CTest/cmCTestResourceSpec.cxx
index 142b07de1a..0e81fa9423 100644
--- a/Source/CTest/cmCTestResourceSpec.cxx
+++ b/Source/CTest/cmCTestResourceSpec.cxx
@@ -10,17 +10,14 @@
#include <cmext/string_view>
-#include <cm3p/json/reader.h>
#include <cm3p/json/value.h>
-#include "cmsys/FStream.hxx"
#include "cmsys/RegularExpression.hxx"
#include "cmJSONHelpers.h"
namespace {
-using JSONHelperBuilder =
- cmJSONHelperBuilder<cmCTestResourceSpec::ReadFileResult>;
+using JSONHelperBuilder = cmJSONHelperBuilder;
const cmsys::RegularExpression IdentifierRegex{ "^[a-z_][a-z0-9_]*$" };
const cmsys::RegularExpression IdRegex{ "^[a-z0-9_]+$" };
@@ -36,165 +33,104 @@ struct TopVersion
};
auto const VersionFieldHelper =
- JSONHelperBuilder::Int(cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_VERSION);
+ JSONHelperBuilder::Int(cmCTestResourceSpecErrors::INVALID_VERSION);
auto const VersionHelper = JSONHelperBuilder::Required<Version>(
- cmCTestResourceSpec::ReadFileResult::NO_VERSION,
- JSONHelperBuilder::Object<Version>(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_VERSION)
+ cmCTestResourceSpecErrors::NO_VERSION,
+ JSONHelperBuilder::Object<Version>()
.Bind("major"_s, &Version::Major, VersionFieldHelper)
.Bind("minor"_s, &Version::Minor, VersionFieldHelper));
-auto const RootVersionHelper =
- JSONHelperBuilder::Object<TopVersion>(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_ROOT)
- .Bind("version"_s, &TopVersion::Version, VersionHelper, false);
+auto const RootVersionHelper = JSONHelperBuilder::Object<TopVersion>().Bind(
+ "version"_s, &TopVersion::Version, VersionHelper, false);
-cmCTestResourceSpec::ReadFileResult ResourceIdHelper(std::string& out,
- const Json::Value* value)
+bool ResourceIdHelper(std::string& out, const Json::Value* value,
+ cmJSONState* state)
{
- auto result = JSONHelperBuilder::String(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_RESOURCE)(out, value);
- if (result != cmCTestResourceSpec::ReadFileResult::READ_OK) {
- return result;
+ if (!JSONHelperBuilder::String(cmCTestResourceSpecErrors::INVALID_RESOURCE)(
+ out, value, state)) {
+ return false;
}
cmsys::RegularExpressionMatch match;
if (!IdRegex.find(out.c_str(), match)) {
- return cmCTestResourceSpec::ReadFileResult::INVALID_RESOURCE;
+ cmCTestResourceSpecErrors::INVALID_RESOURCE(value, state);
+ return false;
}
- return cmCTestResourceSpec::ReadFileResult::READ_OK;
+ return true;
}
auto const ResourceHelper =
- JSONHelperBuilder::Object<cmCTestResourceSpec::Resource>(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_RESOURCE)
+ JSONHelperBuilder::Object<cmCTestResourceSpec::Resource>()
.Bind("id"_s, &cmCTestResourceSpec::Resource::Id, ResourceIdHelper)
- .Bind("slots"_s, &cmCTestResourceSpec::Resource::Capacity,
- JSONHelperBuilder::UInt(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_RESOURCE, 1),
- false);
+ .Bind(
+ "slots"_s, &cmCTestResourceSpec::Resource::Capacity,
+ JSONHelperBuilder::UInt(cmCTestResourceSpecErrors::INVALID_RESOURCE, 1),
+ false);
auto const ResourceListHelper =
JSONHelperBuilder::Vector<cmCTestResourceSpec::Resource>(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_RESOURCE_TYPE,
- ResourceHelper);
+ cmCTestResourceSpecErrors::INVALID_RESOURCE_TYPE, ResourceHelper);
auto const ResourceMapHelper =
JSONHelperBuilder::MapFilter<std::vector<cmCTestResourceSpec::Resource>>(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_SOCKET_SPEC,
- ResourceListHelper, [](const std::string& key) -> bool {
+ cmCTestResourceSpecErrors::INVALID_SOCKET_SPEC, ResourceListHelper,
+ [](const std::string& key) -> bool {
cmsys::RegularExpressionMatch match;
return IdentifierRegex.find(key.c_str(), match);
});
auto const SocketSetHelper = JSONHelperBuilder::Vector<
std::map<std::string, std::vector<cmCTestResourceSpec::Resource>>>(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_SOCKET_SPEC, ResourceMapHelper);
+ cmCTestResourceSpecErrors::INVALID_SOCKET_SPEC, ResourceMapHelper);
-cmCTestResourceSpec::ReadFileResult SocketHelper(
- cmCTestResourceSpec::Socket& out, const Json::Value* value)
+bool SocketHelper(cmCTestResourceSpec::Socket& out, const Json::Value* value,
+ cmJSONState* state)
{
std::vector<
std::map<std::string, std::vector<cmCTestResourceSpec::Resource>>>
sockets;
- cmCTestResourceSpec::ReadFileResult result = SocketSetHelper(sockets, value);
- if (result != cmCTestResourceSpec::ReadFileResult::READ_OK) {
- return result;
+ if (!SocketSetHelper(sockets, value, state)) {
+ return false;
}
if (sockets.size() > 1) {
- return cmCTestResourceSpec::ReadFileResult::INVALID_SOCKET_SPEC;
+ cmCTestResourceSpecErrors::INVALID_SOCKET_SPEC(value, state);
+ return false;
}
if (sockets.empty()) {
out.Resources.clear();
} else {
out.Resources = std::move(sockets[0]);
}
- return cmCTestResourceSpec::ReadFileResult::READ_OK;
+ return true;
}
auto const LocalRequiredHelper =
JSONHelperBuilder::Required<cmCTestResourceSpec::Socket>(
- cmCTestResourceSpec::ReadFileResult::INVALID_SOCKET_SPEC, SocketHelper);
+ cmCTestResourceSpecErrors::INVALID_SOCKET_SPEC, SocketHelper);
-auto const RootHelper = JSONHelperBuilder::Object<cmCTestResourceSpec>(
- cmCTestResourceSpec::ReadFileResult::READ_OK,
- cmCTestResourceSpec::ReadFileResult::INVALID_ROOT)
- .Bind("local", &cmCTestResourceSpec::LocalSocket,
- LocalRequiredHelper, false);
+auto const RootHelper = JSONHelperBuilder::Object<cmCTestResourceSpec>().Bind(
+ "local", &cmCTestResourceSpec::LocalSocket, LocalRequiredHelper, false);
}
-cmCTestResourceSpec::ReadFileResult cmCTestResourceSpec::ReadFromJSONFile(
- const std::string& filename)
+bool cmCTestResourceSpec::ReadFromJSONFile(const std::string& filename)
{
- cmsys::ifstream fin(filename.c_str());
- if (!fin) {
- return ReadFileResult::FILE_NOT_FOUND;
- }
-
Json::Value root;
- Json::CharReaderBuilder builder;
- if (!Json::parseFromStream(builder, fin, &root, nullptr)) {
- return ReadFileResult::JSON_PARSE_ERROR;
+
+ this->parseState = cmJSONState(filename, &root);
+ if (!this->parseState.errors.empty()) {
+ return false;
}
TopVersion version;
- ReadFileResult result;
- if ((result = RootVersionHelper(version, &root)) !=
- ReadFileResult::READ_OK) {
+ bool result;
+ if ((result = RootVersionHelper(version, &root, &parseState)) != true) {
return result;
}
if (version.Version.Major != 1 || version.Version.Minor != 0) {
- return ReadFileResult::UNSUPPORTED_VERSION;
+ return false;
}
- return RootHelper(*this, &root);
-}
-
-const char* cmCTestResourceSpec::ResultToString(ReadFileResult result)
-{
- switch (result) {
- case ReadFileResult::READ_OK:
- return "OK";
-
- case ReadFileResult::FILE_NOT_FOUND:
- return "File not found";
-
- case ReadFileResult::JSON_PARSE_ERROR:
- return "JSON parse error";
-
- case ReadFileResult::INVALID_ROOT:
- return "Invalid root object";
-
- case ReadFileResult::NO_VERSION:
- return "No version specified";
-
- case ReadFileResult::INVALID_VERSION:
- return "Invalid version object";
-
- case ReadFileResult::UNSUPPORTED_VERSION:
- return "Unsupported version";
-
- case ReadFileResult::INVALID_SOCKET_SPEC:
- return "Invalid socket object";
-
- case ReadFileResult::INVALID_RESOURCE_TYPE:
- return "Invalid resource type object";
-
- case ReadFileResult::INVALID_RESOURCE:
- return "Invalid resource object";
-
- default:
- return "Unknown";
- }
+ return RootHelper(*this, &root, &parseState);
}
bool cmCTestResourceSpec::operator==(const cmCTestResourceSpec& other) const