1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
10 #include <cm/optional>
11 #include <cmext/string_view>
13 #include <cm3p/json/value.h>
15 #include "cmCMakePresetsGraph.h"
16 #include "cmCMakePresetsGraphInternal.h"
17 #include "cmJSONHelpers.h"
20 using ReadFileResult = cmCMakePresetsGraph::ReadFileResult;
21 using CacheVariable = cmCMakePresetsGraph::CacheVariable;
22 using ConfigurePreset = cmCMakePresetsGraph::ConfigurePreset;
23 using ArchToolsetStrategy = cmCMakePresetsGraph::ArchToolsetStrategy;
24 using JSONHelperBuilder = cmJSONHelperBuilder<ReadFileResult>;
26 ReadFileResult ArchToolsetStrategyHelper(
27 cm::optional<ArchToolsetStrategy>& out, const Json::Value* value)
31 return ReadFileResult::READ_OK;
34 if (!value->isString()) {
35 return ReadFileResult::INVALID_PRESET;
38 if (value->asString() == "set") {
39 out = ArchToolsetStrategy::Set;
40 return ReadFileResult::READ_OK;
43 if (value->asString() == "external") {
44 out = ArchToolsetStrategy::External;
45 return ReadFileResult::READ_OK;
48 return ReadFileResult::INVALID_PRESET;
51 std::function<ReadFileResult(ConfigurePreset&, const Json::Value*)>
53 std::string ConfigurePreset::*valueField,
54 cm::optional<ArchToolsetStrategy> ConfigurePreset::*strategyField)
56 auto const objectHelper =
57 JSONHelperBuilder::Object<ConfigurePreset>(
58 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
59 .Bind("value", valueField,
60 cmCMakePresetsGraphInternal::PresetStringHelper, false)
61 .Bind("strategy", strategyField, ArchToolsetStrategyHelper, false);
62 return [valueField, strategyField, objectHelper](
63 ConfigurePreset& out, const Json::Value* value) -> ReadFileResult {
65 (out.*valueField).clear();
66 out.*strategyField = cm::nullopt;
67 return ReadFileResult::READ_OK;
70 if (value->isString()) {
71 out.*valueField = value->asString();
72 out.*strategyField = cm::nullopt;
73 return ReadFileResult::READ_OK;
76 if (value->isObject()) {
77 return objectHelper(out, value);
80 return ReadFileResult::INVALID_PRESET;
84 auto const ArchitectureHelper = ArchToolsetHelper(
85 &ConfigurePreset::Architecture, &ConfigurePreset::ArchitectureStrategy);
86 auto const ToolsetHelper = ArchToolsetHelper(
87 &ConfigurePreset::Toolset, &ConfigurePreset::ToolsetStrategy);
89 auto const VariableStringHelper = JSONHelperBuilder::String(
90 ReadFileResult::READ_OK, ReadFileResult::INVALID_VARIABLE);
92 ReadFileResult VariableValueHelper(std::string& out, const Json::Value* value)
96 return ReadFileResult::READ_OK;
99 if (value->isBool()) {
100 out = value->asBool() ? "TRUE" : "FALSE";
101 return ReadFileResult::READ_OK;
104 return VariableStringHelper(out, value);
107 auto const VariableObjectHelper =
108 JSONHelperBuilder::Object<CacheVariable>(
109 ReadFileResult::READ_OK, ReadFileResult::INVALID_VARIABLE, false)
110 .Bind("type"_s, &CacheVariable::Type, VariableStringHelper, false)
111 .Bind("value"_s, &CacheVariable::Value, VariableValueHelper);
113 ReadFileResult VariableHelper(cm::optional<CacheVariable>& out,
114 const Json::Value* value)
116 if (value->isBool()) {
119 /*Value=*/value->asBool() ? "TRUE" : "FALSE",
121 return ReadFileResult::READ_OK;
123 if (value->isString()) {
126 /*Value=*/value->asString(),
128 return ReadFileResult::READ_OK;
130 if (value->isObject()) {
132 return VariableObjectHelper(*out, value);
134 if (value->isNull()) {
136 return ReadFileResult::READ_OK;
138 return ReadFileResult::INVALID_VARIABLE;
141 auto const VariablesHelper =
142 JSONHelperBuilder::Map<cm::optional<CacheVariable>>(
143 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, VariableHelper);
145 auto const PresetWarningsHelper =
146 JSONHelperBuilder::Object<ConfigurePreset>(
147 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
148 .Bind("dev"_s, &ConfigurePreset::WarnDev,
149 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
150 .Bind("deprecated"_s, &ConfigurePreset::WarnDeprecated,
151 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
152 .Bind("uninitialized"_s, &ConfigurePreset::WarnUninitialized,
153 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
154 .Bind("unusedCli"_s, &ConfigurePreset::WarnUnusedCli,
155 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
156 .Bind("systemVars"_s, &ConfigurePreset::WarnSystemVars,
157 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false);
159 auto const PresetErrorsHelper =
160 JSONHelperBuilder::Object<ConfigurePreset>(
161 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
162 .Bind("dev"_s, &ConfigurePreset::ErrorDev,
163 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
164 .Bind("deprecated"_s, &ConfigurePreset::ErrorDeprecated,
165 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false);
167 auto const PresetDebugHelper =
168 JSONHelperBuilder::Object<ConfigurePreset>(
169 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
170 .Bind("output"_s, &ConfigurePreset::DebugOutput,
171 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
172 .Bind("tryCompile"_s, &ConfigurePreset::DebugTryCompile,
173 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
174 .Bind("find"_s, &ConfigurePreset::DebugFind,
175 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false);
177 auto const ConfigurePresetHelper =
178 JSONHelperBuilder::Object<ConfigurePreset>(
179 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
180 .Bind("name"_s, &ConfigurePreset::Name,
181 cmCMakePresetsGraphInternal::PresetStringHelper)
182 .Bind("inherits"_s, &ConfigurePreset::Inherits,
183 cmCMakePresetsGraphInternal::PresetVectorOneOrMoreStringHelper,
185 .Bind("hidden"_s, &ConfigurePreset::Hidden,
186 cmCMakePresetsGraphInternal::PresetBoolHelper, false)
187 .Bind<std::nullptr_t>("vendor"_s, nullptr,
188 cmCMakePresetsGraphInternal::VendorHelper(
189 ReadFileResult::INVALID_PRESET),
191 .Bind("displayName"_s, &ConfigurePreset::DisplayName,
192 cmCMakePresetsGraphInternal::PresetStringHelper, false)
193 .Bind("description"_s, &ConfigurePreset::Description,
194 cmCMakePresetsGraphInternal::PresetStringHelper, false)
195 .Bind("generator"_s, &ConfigurePreset::Generator,
196 cmCMakePresetsGraphInternal::PresetStringHelper, false)
197 .Bind("architecture"_s, ArchitectureHelper, false)
198 .Bind("toolset"_s, ToolsetHelper, false)
199 .Bind("toolchainFile"_s, &ConfigurePreset::ToolchainFile,
200 cmCMakePresetsGraphInternal::PresetStringHelper, false)
201 .Bind("binaryDir"_s, &ConfigurePreset::BinaryDir,
202 cmCMakePresetsGraphInternal::PresetStringHelper, false)
203 .Bind("installDir"_s, &ConfigurePreset::InstallDir,
204 cmCMakePresetsGraphInternal::PresetStringHelper, false)
205 .Bind<std::string>("cmakeExecutable"_s, nullptr,
206 cmCMakePresetsGraphInternal::PresetStringHelper, false)
207 .Bind("cacheVariables"_s, &ConfigurePreset::CacheVariables,
208 VariablesHelper, false)
209 .Bind("environment"_s, &ConfigurePreset::Environment,
210 cmCMakePresetsGraphInternal::EnvironmentMapHelper, false)
211 .Bind("warnings"_s, PresetWarningsHelper, false)
212 .Bind("errors"_s, PresetErrorsHelper, false)
213 .Bind("debug"_s, PresetDebugHelper, false)
214 .Bind("condition"_s, &ConfigurePreset::ConditionEvaluator,
215 cmCMakePresetsGraphInternal::PresetConditionHelper, false);
218 namespace cmCMakePresetsGraphInternal {
219 ReadFileResult ConfigurePresetsHelper(std::vector<ConfigurePreset>& out,
220 const Json::Value* value)
222 static auto const helper = JSONHelperBuilder::Vector<ConfigurePreset>(
223 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
224 ConfigurePresetHelper);
226 return helper(out, value);