resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmCMakePresetsGraphReadJSONConfigurePresets.cxx
1 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2    file Copyright.txt or https://cmake.org/licensing for details.  */
3 #include <cstddef>
4 #include <functional>
5 #include <map>
6 #include <memory>
7 #include <string>
8 #include <vector>
9
10 #include <cm/optional>
11 #include <cmext/string_view>
12
13 #include <cm3p/json/value.h>
14
15 #include "cmCMakePresetsGraph.h"
16 #include "cmCMakePresetsGraphInternal.h"
17 #include "cmJSONHelpers.h"
18
19 namespace {
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>;
25
26 ReadFileResult ArchToolsetStrategyHelper(
27   cm::optional<ArchToolsetStrategy>& out, const Json::Value* value)
28 {
29   if (!value) {
30     out = cm::nullopt;
31     return ReadFileResult::READ_OK;
32   }
33
34   if (!value->isString()) {
35     return ReadFileResult::INVALID_PRESET;
36   }
37
38   if (value->asString() == "set") {
39     out = ArchToolsetStrategy::Set;
40     return ReadFileResult::READ_OK;
41   }
42
43   if (value->asString() == "external") {
44     out = ArchToolsetStrategy::External;
45     return ReadFileResult::READ_OK;
46   }
47
48   return ReadFileResult::INVALID_PRESET;
49 }
50
51 std::function<ReadFileResult(ConfigurePreset&, const Json::Value*)>
52 ArchToolsetHelper(
53   std::string ConfigurePreset::*valueField,
54   cm::optional<ArchToolsetStrategy> ConfigurePreset::*strategyField)
55 {
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 {
64     if (!value) {
65       (out.*valueField).clear();
66       out.*strategyField = cm::nullopt;
67       return ReadFileResult::READ_OK;
68     }
69
70     if (value->isString()) {
71       out.*valueField = value->asString();
72       out.*strategyField = cm::nullopt;
73       return ReadFileResult::READ_OK;
74     }
75
76     if (value->isObject()) {
77       return objectHelper(out, value);
78     }
79
80     return ReadFileResult::INVALID_PRESET;
81   };
82 }
83
84 auto const ArchitectureHelper = ArchToolsetHelper(
85   &ConfigurePreset::Architecture, &ConfigurePreset::ArchitectureStrategy);
86 auto const ToolsetHelper = ArchToolsetHelper(
87   &ConfigurePreset::Toolset, &ConfigurePreset::ToolsetStrategy);
88
89 auto const VariableStringHelper = JSONHelperBuilder::String(
90   ReadFileResult::READ_OK, ReadFileResult::INVALID_VARIABLE);
91
92 ReadFileResult VariableValueHelper(std::string& out, const Json::Value* value)
93 {
94   if (!value) {
95     out.clear();
96     return ReadFileResult::READ_OK;
97   }
98
99   if (value->isBool()) {
100     out = value->asBool() ? "TRUE" : "FALSE";
101     return ReadFileResult::READ_OK;
102   }
103
104   return VariableStringHelper(out, value);
105 }
106
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);
112
113 ReadFileResult VariableHelper(cm::optional<CacheVariable>& out,
114                               const Json::Value* value)
115 {
116   if (value->isBool()) {
117     out = CacheVariable{
118       /*Type=*/"BOOL",
119       /*Value=*/value->asBool() ? "TRUE" : "FALSE",
120     };
121     return ReadFileResult::READ_OK;
122   }
123   if (value->isString()) {
124     out = CacheVariable{
125       /*Type=*/"",
126       /*Value=*/value->asString(),
127     };
128     return ReadFileResult::READ_OK;
129   }
130   if (value->isObject()) {
131     out.emplace();
132     return VariableObjectHelper(*out, value);
133   }
134   if (value->isNull()) {
135     out = cm::nullopt;
136     return ReadFileResult::READ_OK;
137   }
138   return ReadFileResult::INVALID_VARIABLE;
139 }
140
141 auto const VariablesHelper =
142   JSONHelperBuilder::Map<cm::optional<CacheVariable>>(
143     ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, VariableHelper);
144
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);
158
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);
166
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);
176
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,
184           false)
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),
190                           false)
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);
216 }
217
218 namespace cmCMakePresetsGraphInternal {
219 ReadFileResult ConfigurePresetsHelper(std::vector<ConfigurePreset>& out,
220                                       const Json::Value* value)
221 {
222   static auto const helper = JSONHelperBuilder::Vector<ConfigurePreset>(
223     ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
224     ConfigurePresetHelper);
225
226   return helper(out, value);
227 }
228 }