/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include <cstddef> #include <functional> #include <map> #include <memory> #include <string> #include <vector> #include <cm/optional> #include <cmext/string_view> #include <cm3p/json/value.h> #include "cmBuildOptions.h" #include "cmCMakePresetsGraph.h" #include "cmCMakePresetsGraphInternal.h" #include "cmJSONHelpers.h" namespace { using ReadFileResult = cmCMakePresetsGraph::ReadFileResult; using BuildPreset = cmCMakePresetsGraph::BuildPreset; using JSONHelperBuilder = cmJSONHelperBuilder<ReadFileResult>; ReadFileResult PackageResolveModeHelper(cm::optional<PackageResolveMode>& out, const Json::Value* value) { if (!value) { out = cm::nullopt; return ReadFileResult::READ_OK; } if (!value->isString()) { return ReadFileResult::INVALID_PRESET; } if (value->asString() == "on") { out = PackageResolveMode::Force; } else if (value->asString() == "off") { out = PackageResolveMode::Disable; } else if (value->asString() == "only") { out = PackageResolveMode::OnlyResolve; } else { return ReadFileResult::INVALID_PRESET; } return ReadFileResult::READ_OK; } std::function<ReadFileResult(BuildPreset&, const Json::Value*)> const ResolvePackageReferencesHelper = [](BuildPreset& out, const Json::Value* value) -> ReadFileResult { return PackageResolveModeHelper(out.ResolvePackageReferences, value); }; auto const BuildPresetHelper = JSONHelperBuilder::Object<BuildPreset>(ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false) .Bind("name"_s, &BuildPreset::Name, cmCMakePresetsGraphInternal::PresetStringHelper) .Bind("inherits"_s, &BuildPreset::Inherits, cmCMakePresetsGraphInternal::PresetVectorOneOrMoreStringHelper, false) .Bind("hidden"_s, &BuildPreset::Hidden, cmCMakePresetsGraphInternal::PresetBoolHelper, false) .Bind<std::nullptr_t>("vendor"_s, nullptr, cmCMakePresetsGraphInternal::VendorHelper( ReadFileResult::INVALID_PRESET), false) .Bind("displayName"_s, &BuildPreset::DisplayName, cmCMakePresetsGraphInternal::PresetStringHelper, false) .Bind("description"_s, &BuildPreset::Description, cmCMakePresetsGraphInternal::PresetStringHelper, false) .Bind("environment"_s, &BuildPreset::Environment, cmCMakePresetsGraphInternal::EnvironmentMapHelper, false) .Bind("configurePreset"_s, &BuildPreset::ConfigurePreset, cmCMakePresetsGraphInternal::PresetStringHelper, false) .Bind("inheritConfigureEnvironment"_s, &BuildPreset::InheritConfigureEnvironment, cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false) .Bind("jobs"_s, &BuildPreset::Jobs, cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false) .Bind("targets"_s, &BuildPreset::Targets, cmCMakePresetsGraphInternal::PresetVectorOneOrMoreStringHelper, false) .Bind("configuration"_s, &BuildPreset::Configuration, cmCMakePresetsGraphInternal::PresetStringHelper, false) .Bind("cleanFirst"_s, &BuildPreset::CleanFirst, cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false) .Bind("verbose"_s, &BuildPreset::Verbose, cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false) .Bind("nativeToolOptions"_s, &BuildPreset::NativeToolOptions, cmCMakePresetsGraphInternal::PresetVectorStringHelper, false) .Bind("condition"_s, &BuildPreset::ConditionEvaluator, cmCMakePresetsGraphInternal::PresetConditionHelper, false) .Bind("resolvePackageReferences"_s, ResolvePackageReferencesHelper, false); } namespace cmCMakePresetsGraphInternal { ReadFileResult BuildPresetsHelper(std::vector<BuildPreset>& out, const Json::Value* value) { static auto const helper = JSONHelperBuilder::Vector<BuildPreset>( ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS, BuildPresetHelper); return helper(out, value); } }