diff options
-rw-r--r-- | Source/cmCMakePresetsErrors.cxx | 10 | ||||
-rw-r--r-- | Source/cmCMakePresetsErrors.h | 2 | ||||
-rw-r--r-- | Source/cmCMakePresetsGraphReadJSON.cxx | 12 | ||||
-rw-r--r-- | Source/cmJSONHelpers.h | 15 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/HighVersion-stderr.txt | 2 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/LowVersion-stderr.txt | 2 |
6 files changed, 35 insertions, 8 deletions
diff --git a/Source/cmCMakePresetsErrors.cxx b/Source/cmCMakePresetsErrors.cxx index 5919512..ab0afed 100644 --- a/Source/cmCMakePresetsErrors.cxx +++ b/Source/cmCMakePresetsErrors.cxx @@ -238,6 +238,16 @@ void TRACE_UNSUPPORTED(cmJSONState* state) state->AddError("File version must be 7 or higher for trace preset support"); } +JsonErrors::ErrorGenerator UNRECOGNIZED_VERSION_RANGE(int min, int max) +{ + return [min, max](const Json::Value* value, cmJSONState* state) -> void { + state->AddErrorAtValue(cmStrCat("Unrecognized \"version\" ", + value->asString(), ": must be >=", min, + " and <=", max), + value); + }; +} + JsonErrors::ErrorGenerator UNRECOGNIZED_CMAKE_VERSION( const std::string& version, int current, int required) { diff --git a/Source/cmCMakePresetsErrors.h b/Source/cmCMakePresetsErrors.h index dda9274..22830d2 100644 --- a/Source/cmCMakePresetsErrors.h +++ b/Source/cmCMakePresetsErrors.h @@ -94,6 +94,8 @@ void CTEST_JUNIT_UNSUPPORTED(cmJSONState* state); void TRACE_UNSUPPORTED(cmJSONState* state); +JsonErrors::ErrorGenerator UNRECOGNIZED_VERSION_RANGE(int min, int max); + JsonErrors::ErrorGenerator UNRECOGNIZED_CMAKE_VERSION( const std::string& version, int current, int required); diff --git a/Source/cmCMakePresetsGraphReadJSON.cxx b/Source/cmCMakePresetsGraphReadJSON.cxx index df6482d..18ae9af 100644 --- a/Source/cmCMakePresetsGraphReadJSON.cxx +++ b/Source/cmCMakePresetsGraphReadJSON.cxx @@ -256,9 +256,14 @@ auto const VersionIntHelper = auto const VersionHelper = JSONHelperBuilder::Required<int>( cmCMakePresetsErrors::NO_VERSION, VersionIntHelper); +auto const VersionRangeHelper = JSONHelperBuilder::Checked<int>( + cmCMakePresetsErrors::UNRECOGNIZED_VERSION_RANGE(MIN_VERSION, MAX_VERSION), + VersionHelper, + [](const int v) -> bool { return v >= MIN_VERSION && v <= MAX_VERSION; }); + auto const RootVersionHelper = JSONHelperBuilder::Object<int>(cmCMakePresetsErrors::INVALID_ROOT_OBJECT) - .Bind("version"_s, VersionHelper, false); + .Bind("version"_s, VersionRangeHelper, false); auto const CMakeVersionUIntHelper = JSONHelperBuilder::UInt(cmCMakePresetsErrors::INVALID_VERSION); @@ -481,11 +486,6 @@ bool cmCMakePresetsGraph::ReadJSONFile(const std::string& filename, if ((result = RootVersionHelper(v, &root, &parseState)) != true) { return result; } - if (v < MIN_VERSION || v > MAX_VERSION) { - cmCMakePresetsErrors::UNRECOGNIZED_VERSION(&root["version"], - &this->parseState); - return false; - } // Support for build and test presets added in version 2. if (v < 2) { diff --git a/Source/cmJSONHelpers.h b/Source/cmJSONHelpers.h index b35825d..ef94c14 100644 --- a/Source/cmJSONHelpers.h +++ b/Source/cmJSONHelpers.h @@ -390,4 +390,19 @@ struct cmJSONHelperBuilder return func(out, value, state); }; } + + template <typename T, typename F, typename P> + static cmJSONHelper<T> Checked(const JsonErrors::ErrorGenerator& error, + F func, P predicate) + { + return [error, func, predicate](T& out, const Json::Value* value, + cmJSONState* state) -> bool { + bool result = func(out, value, state); + if (result && !predicate(out)) { + error(value, state); + result = false; + } + return result; + }; + } }; diff --git a/Tests/RunCMake/CMakePresets/HighVersion-stderr.txt b/Tests/RunCMake/CMakePresets/HighVersion-stderr.txt index 598478f..f8454b9 100644 --- a/Tests/RunCMake/CMakePresets/HighVersion-stderr.txt +++ b/Tests/RunCMake/CMakePresets/HighVersion-stderr.txt @@ -1,5 +1,5 @@ ^CMake Error: Could not read presets from [^ ]*/Tests/RunCMake/CMakePresets/HighVersion: -Error: @2,14: Unrecognized "version" field +Error: @2,14: Unrecognized "version" 1000: must be >=1 and <=10 "version": 1000, \^$ diff --git a/Tests/RunCMake/CMakePresets/LowVersion-stderr.txt b/Tests/RunCMake/CMakePresets/LowVersion-stderr.txt index e933100..f4f65f9 100644 --- a/Tests/RunCMake/CMakePresets/LowVersion-stderr.txt +++ b/Tests/RunCMake/CMakePresets/LowVersion-stderr.txt @@ -1,5 +1,5 @@ ^CMake Error: Could not read presets from [^ ]*/Tests/RunCMake/CMakePresets/LowVersion: -Error: @2,14: Unrecognized "version" field +Error: @2,14: Unrecognized "version" 0: must be >=1 and <=10 "version": 0, \^ |